Angular,在数据进入后“激活”手表

时间:2014-10-30 20:35:01

标签: javascript angularjs

我正在尝试在示波器上观看$ watch,因此我可以听取更改,但是,我不希望手表在数据进入和填充之前开始侦听。我正在使用$ q工厂,然后填充项目,然后我希望手表在填充完所有内容后开始监听。我似乎无法理解如何控制这些事件的顺序。

所以我在我的控制器中 -

//call to the $q factoy to execut all http calls
getDefaults.resource.then(function(data){
    //fill in scopes with data
    $scope.allAccounts = data[0].data.accounts;

    //THEN watch the scope for changes
    $scope.$watch('selectedResources', function (newValue) { 
        //do action on change here
    });
}

所以我想知道是否有任何方法可以控制角度的这些事件顺序。谢谢你的阅读!

1 个答案:

答案 0 :(得分:1)

您可以为xhr通话创建服务:

.factory('xhrService', function ($http) {
    return {
        getData: function () {
             return $http.get('/your/url').then(cb);
        }
    };

    function cb(data) {
       /// process data if you need
       return data.accounts;
    }
});

之后,您可以在控制器中使用它:

.controller('myController', function (xhrService) {
    $scope.allAccounts = [];

    xhrService.getData()
        .then(function (accounts) {
            $scope.allAccounts = accounts;
            return $scope.allAccounts;
        })
        .then(function () {
           $scope.$watch('allAccounts', function (newValue) {
              // do something
           } 
        });
});

我认为这是构建代码的好方法,因为您可以重用您的服务,并且可以添加(或不添加)您需要的任何手表(在任何控制器内)

最重要的是,来自文档:https://docs.angularjs.org/api/ng/service/ $ q - " $ q.then方法返回新承诺,通过返回值解析或拒绝successCallback,errorCallback" - 这就是为什么每个then callback都需要一个return语句。