1

我正在寻找一个关于使用 AngularJS 轮询数据的解决方案,我在 stackoverflow 上找到了。

在这个解决方案(如下所示)中,它使用了一个 javascript 对象来返回响应(data.response),如果我尝试将该data对象替换为一个简单的 javascript 数组不起作用,我想确切地知道为什么我需要使用点表示法以及为什么单个数组不起作用?(这将是很好的链接或示例解释)

app.factory('Poller', function($http, $timeout) {
  var data = { response: {}, calls: 0 };
  var poller = function() {
    $http.get('data.json').then(function(r) {
      data.response = r.data;
      data.calls++;
      $timeout(poller, 1000);
    });      
  };
  poller();

  return {
    data: data
  };
});

试图总结我的目标(我想真正理解的):var data = { response: {}, calls: 0 };可以在哪里var data = {};,然后response.data将直接设置为数据data = r.datareturn {data: data};,为什么我需要依赖点符号?

4

1 回答 1

7

假设我们以这种方式更改工厂:

app.factory('Poller', function($http, $timeout) {
  var d = {};
  var poller = function() {
    $http.get('data.json').then(function(r) {
      d = r.data;
      $timeout(poller, 1000);
    });
  };
  poller();

  return d;
});

在控制器中,语句$scope.data = Poller;将d对象赋值给$scope.data,所以初始化后的对象关系是这样的

$scope.data -> d -> r.data

当 1 秒内再次调用 poller() 时,d 被替换为新对象,因此对象关系为

$scope.data -> d* -> r.data (d* is a new object)

因此 angularjs 的数据绑定将被破坏,因为 d* 是具有不同原型的全新对象,因此无法追踪到 r.data。

使用点表示法,初始化后对象关系永远不会改变,因为对 poll() 的定期调用不会创建新对象d,但它只是用新r.data对象不断更新响应字段。

$scope.data -> d.response -> r.data
于 2013-08-04T06:02:58.793 回答