0

すべて正常に動作しますが、サービスからソースを取得するのに問題があります。

以下にSERVICEコードがあります。

app.factory('myService', 
    function($rootScope, ResourceData) {
    var result = {};
    var data   = ResourceData.query();

    result.getData = function() {
        // problem here
    }

    return result;
});

そして、CONTROLLERにはコードが含まれています。

app.controller('myController', ['$scope', 'myService', 
    function myController($scope, myService) {
       $scope.data = myService.getData();
});

私の問題は、私のサービスにこのような機能があるかどうかです

result.getData = function() {
   return data;
}

すべて正常に動作しますが、取得する前にそのデータをフィルタリングする必要があります

このように本体を変更すると、空の配列が得られます。問題はAngularJSからのもののようです。

静的配列を作成すると機能します。

result.getData = function() {
   var arr = [];

        angular.forEach(data, function(item, key) {
              // simple filter
              if(item.ID > 10) {
                  return;
              }          
              else {
                  arr.push(item);
              }  
        });

        return arr;
}
4

1 に答える 1

2

「ResourceData.query ()」の結果は非同期です。

サーバーからデータが返されるとオブジェクトはリソースクラスのインスタンスになります... $ resourceオブジェクトメソッドを呼び出すと、すぐに空の参照(isArrayに応じてオブジェクトまたは配列)が返されることを理解することが重要です。サーバーからデータが返されると、既存の参照に実際のデータが入力されます。

ページが最初に読み込まれるとき、サーバーからデータが返される前にコントローラーが実行されると推測します。したがって、getData()が最初に呼び出されたときdataは、おそらくまだデータが入力されていないため、空の配列が取得されます。

この問題の解決策の1つは、サービスではなく、ビュー/HTMLのデータをAngularフィルターでフィルター処理することです。

<div ng-repeat="item in data | filter:myFilter">
   {{item.ID}}: {{item...}}
</div>

次に、コントローラーで:

$scope.myFilter = function(item) {
   return item.ID <= 10;
}
于 2013-01-02T04:04:41.247 に答える