0

私は以下のようにアプリケーションをセットアップしています:

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

myApp.factory('MotorList', ['$resource', function($resource) {
    return $resource(baseURL + 'MotorList.json', {}, {} );
}]);

myApp.factory('MotorDataManager', function(MotorList) {
 var List;

 MotorList.query().$then(function(value){
   List = value.data;
}) 

return {
  getFullList: function() {
    return List;
  }
  anotherFunction: function { ... }
}

});

myApp.controller('MainCtrl', function($scope,MotorDataManager){
  $scope.tableData  = MotorDataManager.getFullList();
})

私のフロントエンドには、$scope.tableData をループする ng-repeat があります。ただし、私が直面している問題は、 $scope.tableData がレンダリングされないことです。リソースは正常に動作しています。データは返されますが、これはタイミングの問題だと思いますが、解決方法がわかりません。

4

1 に答える 1

0

確かに、これはタイミングの問題です。を呼び出すとMotorDataManager.getFullList()undefinedそれを設定するコールバックが設定されないため、取得されます。したがって、$scope.tableData未定義です。

$scope.tableData変更するものへの参照が必要です。これを行う1つの方法は次のとおりです。

myApp.factory('MotorDataManager', function(MotorList) {
   var list = [];

   MotorList.query().$then(function(value){
     angular.forEach(value, function(item) {
        list.push(item);
     });
  }); 

  return {
    getFullList: function() {
      return list;
    }
  }
});

myApp.controller('MainCtrl', function($scope,MotorDataManager){
  $scope.tableData  = MotorDataManager.getFullList();
});

この例では、配列を返すため、最初$scope.tableDataは空の配列になります。しかし、これで問題ありません。何かへの参照ができたからです。が$resource戻ると、配列 (同じ参照) に値が設定されるため、コントローラーには値が設定された配列が含まれるようになります。Angular のデータ バインディングと消化ロジックが残りを処理する必要があります。

于 2013-08-29T18:26:59.423 に答える