2014-09-17 4 views
0

저는 angular.js를 처음 사용하고 있으며 $http.get$http.post과 같은 $ http 함수를 사용하는 방법을 이해하려고합니다.

Java Rest 서비스를 통해 MySQL 데이터베이스에서 메시지를 검색하는 매우 간단한 앱이 있습니다. 내가 볼

function MessageController($scope, $http) { 
    $scope.getAll = function(callback) { 
    $http.get('/messages').success(function(response) { callback(response); }); 
    } 

    $scope.messages = $scope.getAll(function(data) { return JSON.stringify(data); }); 
} 

:

<div ng-controller="MessageController"> 
    <ul> 
    <li ng-repeat="m in messages">{{m.content}}</li> 
    </ul> 
</div> 

그리고 내 컨트롤러가 같은 외모 : 나는 NG 반복과 같이 사용하여 목록을 시도하고

[ 
    {id:1, content:"Hello World!"}, 
    {id:2, content:"Testing 1, 2, 3..."}, 
    {id:3, content:"I am from the database"} 
] 

: 데이터는 같은 외모를 반환 호출은 메시지 객체의 배열을 제대로 리턴하고 콜백 함수 내에서 콘솔로 출력 할 수 있지만 어떤 이유인지 그들은 ng-repeat에 표시되지 않습니다. 수동으로 메시지 목록을 만들 때이 기능을 사용할 수 있었지만 $http.get 조각을 도입하면 작동이 중지되었습니다.

내가 누락 된 항목이 있습니까?

편집 : 난 당신이 코드가 작동하지만 다음과 같은 작업을해야되지 왜 왔는지 모르겠어요 angular.js 버전 1.2.19

+0

응답을'console.log' 해 보셨습니까? 보통 데이터는'$ http' 콜백에서'response' 객체의'data' 속성에 있습니다. '콜백 (응답)'을'콜백 (응답 데이터)'으로 변경해보십시오. – KhalilRavanna

+0

@KhalilRavanna get 함수에서 ... log.log (response); 콜백 (응답); ... '그리고 위에서 언급 한 JSON 배열이 출력된다. 'response.data'를 시도했을 때'undefined'를 출력했습니다. – feenz

+1

그렇게 간단 할 것이라고 생각했습니다. 아래의 답변과 같이 보입니다. '$ scope.getAll' 함수가 실제로 아무 것도 반환하지 않기 때문에 업데이트하지 않습니다. $ scope.messages 자체를 업데이트하거나 $ scope.getAll'이'$ http.get'을 리턴하게하고 success 콜백의 내부에서'callback (response)'를 리턴 할 수 있습니다. 그런 식으로'$ scope.getAll' 메소드는 평가 된 콜백으로 해결할 약속을 반환합니다. 그게 효과가 있다고 생각합니다. '$ resource'도 작동하지만 나는 그 서비스를 싫어합니다. – KhalilRavanna

답변

2

는 AngularJS와 버전 1.2 당으로, 배열은 약속 (migration notes 참조)에서 (기본적으로) 더 이상 풀어되지 않습니다. 나는 그것이 Objects으로 여전히 작동하는 것을 보았지만, 문서에 따르면 그 것에 의존해서는 안됩니다.

대신 $resource을 사용해야합니다. 리소스는 더 이상 약속을 반환하지 않지만 '미래'의 객체는 반환합니다. 실제로 이것은 REST 호출에 따라 빈 객체 또는 배열을 의미하며 REST 호출이 해결되면 자체를 채 웁니다 (example). 귀하의 경우에는

는 다음 (의사)과 같이 될 것이다 :

function MessageController($scope, $resource) { 
    var resource = $resource('/messages'); 
    $scope.messages = resource.query(function (data) { 
     return JSON.stringify(data); // is this really necessary, though? 
    }); 
    // $scope.messages = resource.query(); // should be enough 
} 

당신은 그에 대한 ngResource 모듈 의존성을 (색인에 각-resource.js을 포함하는 것을 잊지 마세요해야합니다. html) :

+0

''ngResource' 조각을 추가하면 작동시킬 수있었습니다. 또한 올바른 JSON.stringify (data);는 필요하지 않았습니다. – feenz

1

을 사용하고 있습니다. $scope은 콜백에서 업데이트됩니다.

function MessageController($scope, $http) { 
    $scope.getAll = function(callback) { 
    $http.get('/messages').success(function(response) { callback(response); }); 
    } 

    $scope.getAll(function(data) { $scope.messages = JSON.stringify(data); }); 
} 
+2

그의 코드가 작동하지 않는 이유를 아주 분명히 알 수 있습니다. '$ scope.getAll'는 아무 것도 반환하지 않으므로, 내부에서 무슨 일이 일어나고 있건 상관없이'$ scope.messages'는'undefined'가됩니다. 콜백에 의해 리턴 된 데이터는 호출자의 범위 내에서만 접근 가능하다 ('$ http'의'success' 메소드). 그리고 발신자는 아무 것도하지 않습니다. 'success'가 결과를 리턴한다면 비동기'$ http' 호출 이후에 리턴 할 것이므로 쓸모가 없습니다. –

1

$ gett http 호출의 success 함수 안에 $ scope.messages 변수에 값을 할당해야합니다. 이런 식으로 뭔가 : (plunker 참조)

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

app.controller('MessageController', function($scope, $http) { 


    $scope.getAll = function() { 
    $http.get('data.json').success(function(response) { 
     $scope.messages = response; 
    }); 
    } 

    $scope.getAll(); 

}); 
0

내가 함께 해결 : 전화 후

  • ,

    $scope.myRender = false; 
    
  • 변수

    그런 다음 호출을 초기화 ...후 성공 :

    $scope.myRender = true; 
    

과 HTML ng-if="myRender" ng-model="myModel"

행운을 사용!

관련 문제