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();
            }
        }
    });
};

にアクセスしようとすると、 undefined のプロパティを読み取れないvalue[i].typeというエラーがスローされます。非同期呼び出しが原因であることはわかっています。type

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

誰でも私を助けることができますか?? これよりも効率的なことを提案した方がよいでしょう。ありがとうございました

4

3 に答える 3

2

@Mahbubの提案は正しい方向に向かっていますが(約束により非同期関数の調整が容易になります)、それが唯一の手法ではありません。古き良きコールバックも同様に機能します。promisesは間違いなくよりエレガントなAPIですが、APIをpromiseするという苦い真実は$resource、AngularJSの現在のバージョンの一部としてサポートされていません。

理論はさておき、あなたの特定のケースでは、単にコールバックを使用してそれで済ますことができます:

$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 のプルは、$resource の promise を返す「マージ可能」とマークされました。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 に答える