AngularJS服务 - 控制器之间的数据不更新

时间:2017-02-06 00:36:56

标签: angularjs

使用我的工厂/服务时,我无法保持2个控制器同步。

我(稍微缩小)

angular.factory('API', ['$http', function($http){

    let self = this;

    self.scans = [];

    self.updateHistory = function (cb) {
        return $http.get('/scanner/history').then(function(scans){
            self.scans = scans.data;
            if (cb) {
                return cb(self.scans);
            } else {
                return self.scans;
            }
        }, function(err){
            console.error(err);
        });
    };

    return self;
 }]);

然后我的控制器

angular.controller('NewCrawl', ['$scope', 'API', function ($scope, API) {

    $scope.scan = {
        url: null
    };

    $scope.startScan = function () {
        if ($scope.scan.url) {
            API.start($scope.scan.url)
            .then(function(){
                API.updateHistory();
            });
        }
    };
}])

angular.controller('ScanHistory', ['$scope', 'API', function($scope, API){
    $scope.scans = API.scans;
    API.updateHistory();
}])

然后我在我的ScanHistory控制器中有一个ngRepeat,如

<tbody>

    <tr ng-repeat="scan in scans | orderBy:'id':true">
        <td><% scan.id %></td>
        <td><% scan.url %></td>
        <td><% scan.started %></td>
        <td><% finishedText(scan) %></td>
        <td><% scan.errors.length %></td>
    </tr>

</tbody>

所以这基本上就是设置,问题是 - 当我运行API.updateHistory()时它会触发,如果我在服务中console.log(self.scans)',我会得到预期的结果。

但是,即使API.updateHistory方法返回了正确的结果,我的ngRepeat也不会使用新添加的项进行更新。

为什么!?

1 个答案:

答案 0 :(得分:0)

当您调用API.updateHistory()函数时,NewCrawl只会在$scope.startScan控制器中触发。它不会影响其他控制器(ScanHistory),因为即使您在那里注入API服务它们也没有连接。如果要同步两个控制器,请使用$rootscope。我想你可以在这篇文章How to call a function from another controller in angularjs?

中得到一些想法