내 angular.js ng-model에 json을로드하는 방법은 무엇입니까?


114

나는 아마도 매우 명백한 질문이라고 생각하지만 어디에서도 답을 찾을 수 없었습니다.

내 서버에서 클라이언트로 일부 JSON 데이터를로드하려고합니다. 지금은 JQuery를 사용하여 AJAX 호출 (아래 코드)로로드합니다.

<script type="text/javascript">
var global = new Array();
$.ajax({
    url: "/json",
    success: function(reports){
        global = reports;
        return global;
        }
    });
</script>

이것은 html 파일에 있습니다. 지금까지 작동하지만 문제는 AngularJS를 사용하고 싶다는 것입니다. 이제 Angular는 변수를 사용할 수 있지만 모든 것을 변수에로드 할 수 없으므로 for each 루프를 사용할 수 있습니다. 이는 일반적으로 .js 파일에있는 "$ Scope"와 관련된 것으로 보입니다.

문제는 다른 페이지의 코드를 .js 파일로로드 할 수 없다는 것입니다. Angular의 모든 예제는 다음과 같은 것만 보여줍니다.

function TodoCtrl($scope) {
  $scope.todos = [
    {text:'learn angular', done:true},
    {text:'build an angular app', done:false}];

따라서 IA)이 모든 것을 손으로 입력하고 B) 모든 데이터가 무엇인지 미리 알고있는 경우에 유용합니다.

사전에 알지 못하며 (데이터가 동적 임) 입력하고 싶지 않습니다.

따라서 $ Resource를 사용하여 AJAX 호출을 Angular로 변경하려고 시도했을 때 작동하지 않는 것 같습니다. 이해할 수 없을 수도 있지만 JSON 데이터에 대한 비교적 간단한 GET 요청입니다.

tl : dr 외부 데이터를 각도 모델에로드하기 위해 AJAX 호출이 작동하도록 할 수 없습니다.


3
$ Resource 사용 시도를 볼 수 있습니까? 그것은 우리가 당신이를 디버그하는 데 도움 경우 그래서 아마도 그것은 가장 쉬운 방법, 작동합니다 ...
크리스 젠킨스

답변:


189

Kris가 언급했듯이 $resource서비스를 사용하여 서버와 상호 작용할 수 있지만 Angular로 여정을 시작하고 있다는 인상을 받았습니다. 지난주에 있었으므로 $http서비스로 직접 실험을 시작하는 것이 좋습니다 . 이 경우 당신은 그것의get 메서드를 .

다음 JSON이있는 경우

[{ "text":"learn angular", "done":true },
 { "text":"build an angular app", "done":false},
 { "text":"something", "done":false },
 { "text":"another todo", "done":true }]

다음과 같이로드 할 수 있습니다.

var App = angular.module('App', []);

App.controller('TodoCtrl', function($scope, $http) {
  $http.get('todos.json')
       .then(function(res){
          $scope.todos = res.data;                
        });
});

get메서드는 첫 번째 인수가 성공 콜백이고 두 번째 인수가 오류 인 promise 개체를 반환합니다. 콜백 인 .

$http함수 Angular의 매개 변수로 추가 하면 마술을하고 $http컨트롤러에 리소스를 주입합니다 .

여기에 몇 가지 예를 넣었습니다.


정말 감사합니다. 대신 $ http 서비스를 사용하게되었습니다 ... 약간 다른 방식이긴하지만 ... code$ http.get ( '/ json'). success (function (response) {$ scope.reports = response; GetData의은 (); code 무엇을 나에게 흥미, 난 정말 더 그것에 대해 배우고 싶은 ... 약속 개체입니다 나는 그것의 아이디어를 사랑 나는 기본적으로 너무 아약스 요청에 루프를 실행하는 데 한 다른 문제.. 나는 끊임없이 "자동적으로"페이지를 새로 고칠 수 있습니다 $ 제한 시간이 나를 위해 작동되지 않았습니다..
MJR_III

1
나는 그것이 $ scope.todos = res이어야한다고 믿습니다; res.data 대신.
Anoyz 2013

응답 객체는 네 가지 속성이있다 : config, data, headersstatus. data속성 의 값은 원하는 것입니다.
jaime

1
$ scope.todos = []; http 요청 전에는 템플릿에 오류가 발생하지 않도록 최소한 기본 빈 구조가 있어야합니다.
S ..

1
재 : $scope.todos = res;$scope.todos = res.data;- 차이 당신이에 여부 .then(response)나에 주어진다 는 동안 전체 주어집니다 . .success(result).successresponse.data.thenresponse
Jesse Chisholm은

28

다음은 Angular 모델에 JSON 데이터를로드하는 방법에 대한 간단한 예입니다.

Microsoft Northwind SQL Server 데이터베이스 의 온라인 복사본에서 고객 세부 정보 목록을 반환하는 JSON 'GET'웹 서비스가 있습니다.

http://www.iNorthwind.com/Service1.svc/getAllCustomers

다음과 같은 JSON 데이터를 반환합니다.

{ 
    "GetAllCustomersResult" : 
        [
            {
              "CompanyName": "Alfreds Futterkiste",
              "CustomerID": "ALFKI"
            },
            {
              "CompanyName": "Ana Trujillo Emparedados y helados",
              "CustomerID": "ANATR"
            },
            {
              "CompanyName": "Antonio Moreno Taquería",
              "CustomerID": "ANTON"
            }
        ]
    }

.. 그리고이 데이터로 드롭 다운 목록을 채우고 싶습니다.

Angular 스크린 샷

각 항목의 텍스트는 "CompanyName"필드에서 가져오고 ID는 "CustomerID"필드에서 가져 오길 원합니다.

어떻게할까요?

내 Angular 컨트롤러는 다음과 같습니다.

function MikesAngularController($scope, $http) {

    $scope.listOfCustomers = null;

    $http.get('http://www.iNorthwind.com/Service1.svc/getAllCustomers')
         .success(function (data) {
             $scope.listOfCustomers = data.GetAllCustomersResult;
         })
         .error(function (data, status, headers, config) {
             //  Do some error handling here
         });
}

... "listOfCustomers"변수를이 JSON 데이터 세트로 채 웁니다.

그런 다음 HTML 페이지에서 다음을 사용합니다.

<div ng-controller='MikesAngularController'>
    <span>Please select a customer:</span>
    <select ng-model="selectedCustomer" ng-options="customer.CustomerID as customer.CompanyName for customer in listOfCustomers" style="width:350px;"></select>
</div>

그리고 그게 다야. 이제 웹 페이지에서 사용할 준비가 된 JSON 데이터 목록을 볼 수 있습니다.

이에 대한 핵심은 "ng-options"태그에 있습니다.

customer.CustomerID as customer.CompanyName for customer in listOfCustomers

머리를 돌리는 것은 이상한 구문입니다!

사용자가이 목록에서 항목을 선택하면 "$ scope.selectedCustomer"변수가 해당 고객 레코드의 ID (고객 ID 필드)로 설정됩니다.

이 예제의 전체 스크립트는 여기에서 찾을 수 있습니다.

Angular를 사용한 JSON 데이터

마이크


실제로 작동합니까? JSON이 유효하지 않습니다 (키가 따옴표 안에 있지 않음). 오류가 발생하지 않습니까?
CodyBugstein 2014

죄송합니다, 당신 말이 맞아요. 우수한 JSONView 추가 기능이 설치된 Google 크롬에서 위의 스크린 샷을 가져 왔습니다 (그러므로 JSON을 멋진 형식으로 볼 수 있습니다). 하지만 예, 내 웹 서비스의 JSON은 유효합니다. 내 기사의 링크를 클릭하면이 코드의 라이브 버전을 볼 수 있습니다.
Mike Gledhill 2014

작동합니까? 나는 그것이 data.GetAllCustomersResult이어야한다고 생각한다
ihappyk

죄송합니다. 당신 말이 절대적으로 맞습니다. "GetAllCustomersResult"에 JSON 결과를 래핑하도록 웹 서비스를 변경 했으므로 예, 이것이 필요합니다. 코드 샘플을 업데이트했습니다. 알려 주셔서 감사합니다.
Mike Gledhill 2015 년

0

나는 인터넷 어딘가에서 소스를 기억하지 못하는 다음 코드를 사용합니다.

    var allText;
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, false);
    rawFile.onreadystatechange = function () {
        if (rawFile.readyState === 4) {
            if (rawFile.status === 200 || rawFile.status == 0) {
                allText = rawFile.responseText;
            }
        }
    }
    rawFile.send(null);
    return JSON.parse(allText);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.