从服务等外部源检索数据时,保持数据与$ scope同步

时间:2014-01-17 19:28:12

标签: javascript angularjs

以下是一个示例:http://plnkr.co/edit/Vzb3eLO341M48zE7mSDa

在现实世界中,add函数可以调用REST api将字符串添加到数据库,然后返回一个数组,例如,自上次调用REST api以来,其他用户添加的所有数据。你有一个“更完整”的列表,而不是只保留一个本地同步的数组副本。

在DataService.getDataArray()中,我们返回一个默认的本地数组。当控制器初始化时,该功能显然被调用一次。

由于我们丢失了指向masterArray的指针,如何以angularjs方式让范围知道我们需要再次调用getDataArray?这是必须手动完成的吗?是否存在阵列已更新的事件?

我知道有很多潜在的“这个正常工作”的解决方案,但我只对 angularjs 方法感兴趣,以解决保持数据同步的问题。从外部来源返回的数据。

1 个答案:

答案 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)
        }
     }
})