以下是一个示例:http://plnkr.co/edit/Vzb3eLO341M48zE7mSDa
在现实世界中,add函数可以调用REST api将字符串添加到数据库,然后返回一个数组,例如,自上次调用REST api以来,其他用户添加的所有数据。你有一个“更完整”的列表,而不是只保留一个本地同步的数组副本。
在DataService.getDataArray()中,我们返回一个默认的本地数组。当控制器初始化时,该功能显然被调用一次。
由于我们丢失了指向masterArray的指针,如何以angularjs方式让范围知道我们需要再次调用getDataArray?这是必须手动完成的吗?是否存在阵列已更新的事件?
我知道有很多潜在的“这个正常工作”的解决方案,但我只对 angularjs 方法感兴趣,以解决保持数据同步的问题。从外部来源返回的数据。
答案 0 :(得分:1)
如果我理解正确,您只希望范围监视服务中数据的更改?您可以使用$watch
执行此操作。此外,如果数据同步是一个问题,您可以考虑轮询更新,而不是依赖于用户自己添加值而到达的更新。
例如:
.controller('MainCtrl', function($scope, DataService) {
DataService.startPolling()
$scope.$watch(function() { return DataService.getDataArray() }, function(data) {
$scope.someData = data
})
$scope.addAction = function(data) {
DataService.add(data)
}
})
.factory("DataService", function($http, $interval) {
var masterArray = ["0"],
intervalID
function pollForNewValues() {
$http.get(...).then(response) {
// push new values to masterArray
})
}
function saveVal(value) {
$http.post(...).then(response) {
// push new values to masterArray
})
}
return {
add: function(whattoadd) {
saveVal(whattoadd)
},
getDataArray: function() {
return masterArray;
},
startPolling: function() {
intervalID = $interval(function() {
pollForNewValues()
}, 5000)
},
stopPolling: function() {
$interval.cancel(intervalID)
}
}
})