1

我有这个工厂的角度:

'use strict';

angular.module('finansiiApp')
  .factory('transactions', function ($http) {
    var transactions = [];
    $http.get("/api/transactions.json")
      .success(function(data, status){
        transactions = data;
      });

    // Public API here
    return {
      getTransactions: function () {
        return transactions;
      },
      addTransaction: function(transaction){
        transactions.push(transaction);
      }
    };
  });

这是我的控制器:

'use strict';

angular.module('finansiiApp')
  .controller('MainCtrl', function ($scope, transactions) {
    $scope.searchText = "";
    $scope.filterPrimanja = $scope.filterTrosoci = true;
    console.log(transactions);
    $scope.transactions = transactions.getTransactions();
    $scope.clicked = function(index){
      console.log(index);
    }
  });

现在您可能已经猜到了,我在控制器中的数据(我在其中调用 getTransactions 方法)不会在成功时更新。我将如何进行这项工作?

4

1 回答 1

2

你可以改变一些事情。(以及您可以更改它们的方法)。1 是最建议/最正确的。

  1. 在控制器中使用承诺和回调,所以......

    // your controller... ($scope.transactions line)
    transactions.getTransactions().then(function(data){
        $scope.transactions = data;
    }
    
    // your service..
    angular...factory('transactions',function($http,$q){
        var transactions = [];
        return {
            getTransactions: function(){
               //is a request needed?
               if(transactions.length > 0){
                   var deferred = $q.defer();
                   deferred.resolve(transactions);
                   return deferred.promise;
               }
               return $http.get("/api/transactions.json").then(function(result){
                   //modify collection of transactions...
                   transactions = result.data;
                   return transactions; // this is data ^^ in the controller
               });
            }
            addTransaction: function(transaction){
                //do more http stuff?
                //wrap function in promise so its consistent and will also run digest.
                var deferred = $q.defer();
                transactions.push(transaction);
                deferred.resolve(transactions);
                return deferred.promise;
            }
        }
    
    });
    
  2. 修改var transactions = [];而不是仅仅抹去它。例如。迭代新数据并推送/弹出 unshift,concat w/e 以角度绑定的对象需要是幂等的

要记住的另一件事是服务只实例化一次。虽然控制器一直在创建和销毁。您可能不必每次都发出请求,所以在返回 $http 承诺之前,getTransactions您可以检查是否需要发出请求。然后手动使用一个promise。

于 2014-01-15T02:07:46.550 回答