3

我有一个函数使用 $http 通过 ajax 获取对象数组:

$scope.getArray = function(page) {
    return $http.get(page).then(function(data) {
        return data.data;
    });
};

我这样使用它:

$scope.array = $scope.getArray('somepage');

这段代码实际上有效,我在视图上有我想要的数据。

但是,我想在这个数组的末尾添加一些数据。我试过了

$scope.addToArray = function(newItem) {
    $scope.array.push(newItem);
};

但这没有用。

任何想法如何做到这一点?谢谢。

4

2 回答 2

1

看来你是在践踏承诺!

如果您希望能够处理从 getArray 返回的数据,那么您不应该将承诺分配给您的范围变量。相反,改变 getArray 的工作方式:

$scope.getArray = function(page) {
    var propertyAccessor = $parse(page);
    return $http.get(page).then(function(data) {
        page.assign($scope, data.data);
    });
};

现在,当您调用 get array 时,它会将数据数据加载到 data 属性中,您将能够对其进行修改(一旦它第一次运行)

$scope.getArray('somepage');

$scope.addToArray = function(page, newItem) {
   var propertyAccessor = $parse(page);
   propertyAccessor($scope).push(newItem);
}

$scope.addToArray('somepage', 'someValue');

在这里放了一个演示,它既有你的原始实现(使用 $q 模拟),也有我的工作示例。

于 2013-05-23T10:00:52.450 回答
1

我选择了一种不同的方法来解决这个问题。不确定它是否更好,但无论如何我都会把它放在这里。

(function(utility) {
    angular.module('app').

    service('data',['$q', function($q) {
      var deferred = $q.defer();
      var data = ['bla', 'bla'];

      //some async $http stuff being done resulting in deferred.resolve(data)

      utility.add = function(stuff) {
        data.push(stuff);
      };

      return deferred.promise;
    }]).

    service('dataService', [function() {

      return {
        add: function(data) {
          utility.add(data);
      };

  }]);
}({}));

基本上,任何只对我的阵列感兴趣的控制器都会data注入,而任何可能对向我的阵列添加东西感兴趣的人都会dataService注入。然后我在一个对象上创建一个闭包,该utility对象包含一个add将东西推入数组的函数。这有效(至少在 1.0.8 上),因为承诺保留对原始数组的引用,并且当我更改原始数组时,解析的值实际上会更新。

这样,mycontroller就完全$http与 我的数据也被缓存了,因为服务是单例,而控制器不是。

于 2013-10-26T09:02:32.953 回答