3

我有一项angularjs服务来获取我的json数据。

// Controller.js file
$scope.data=Events.query();

$scope.getEventtypes = function(){
    angular.forEach($scope.data,function(value, key){
        var arr = [];
        if(key==$scope.month+$scope.year)  {
            for(var i=0; i<key.length; i++) {
                arr.push(value[i].type);
                $scope.eventtypes=arr.unique();
            }
        }
    });
};

尝试访问value[i].type时会抛出错误cannot read property typeof undefined。我知道这是因为异步调用。

//i want to add success function like this
$http.get('').success(function(data) {
....
});

谁能帮我??如果你建议做一些比这更有效的事情会更好。谢谢

4

3 回答 3

6

我使用异步 $http 服务(使用 jsonp)得到了类似的答案。

基本上你需要:

  • 使用回调或
  • 使用承诺对象

承诺:

var promise = service.getHistoricalDataWithQ($scope.symbol, $scope.startDate, $scope.endDate);

promise.then(function(data) {
   $scope.items = data;
});            

使用回调:

service.getHistoricalDataWithCallback(function (data) {
    $scope.items = data;
}, $scope.symbol, $scope.startDate, $scope.endDate);

请参阅使用 $htp 和 YQL回答Angular 。

见我的jsFiddle

于 2012-12-24T12:36:35.417 回答
2

虽然@Mahbub 的建议是正确的(promises 使协调异步函数变得更容易),但它并不是唯一的技术。好的,旧的回调也可以工作。$resource虽然 Promise 可以说是更优雅的 API,但在当前版本的 AngularJS 中不支持 Promise API 的苦涩事实。

除了理论,在您的特定情况下,您可以简单地使用回调并完成它:

$scope.data=Events.query(function(data){

   angular.forEach(data,function(value, key){
        var arr = [];
        if(key==$scope.month+$scope.year)  {
            for(var i=0; i<key.length; i++) {
                arr.push(value[i].type);
                $scope.eventtypes=arr.unique();
            }
        }
    });
});
于 2012-12-24T10:52:51.823 回答
1

为此,$resource 需要像 $http 一样返回一个 Promise 对象。但是 Angular 的最新版本还不支持。

Partap 的 pull 被标记为 "good to merge",它返回了 $resource 的承诺。https://github.com/angular/angular.js/pull/1547。您需要使用此https://github.com/partap/angular.js/blob/005e865e5629a241d99c69a18f85fc2bb5abb1bc/src/ngResource/resource.js更改您的 resource.js 文件

所以你可以使用它并像这样重构你的代码

Events.query().$q.then(function(response){
 $scope.data=response;
 ....
 ....
});
于 2012-12-24T08:33:24.007 回答