我正在寻找一个关于使用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.data
和return {data: data};
,为什么我需要依赖点符号?
假设我们以这种方式更改工厂:
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
当poller()在1秒后再次被调用时,d被一个新对象替换,因此对象关系将是
$scope.data -> d* -> r.data (d* is a new object)
因此angularjs的数据绑定将被破坏,因为没有办法追踪r.data,因为d*是一个具有不同原型的全新对象。
使用点表示法,初始化后,对象关系永远不会改变,因为对poll()的定期调用不会创建新的对象d
,但它只是用新的r.data
对象不断更新响应字段。
$scope.data -> d.response -> r.data