Javascript 角度-工厂数据更改时更新范围

Javascript 角度-工厂数据更改时更新范围,javascript,angularjs,Javascript,Angularjs,我正在使用工厂来轮询特定的web服务。此web服务用于更新工厂中的任何数据。我在主控制器中启动此工厂,并通过工厂函数填充范围变量。变量初始化正确,我在屏幕上获得了正确的数据,但我正在努力让数据自动绑定 编辑以获取其他注释: 此代码位于Factory中的原因是我计划跨多个视图使用Factory数据 以下是我到目前为止的情况: App.factory('metrics', function($http, $q, $timeout){ var service; var users =

我正在使用工厂来轮询特定的web服务。此web服务用于更新工厂中的任何数据。我在主控制器中启动此工厂,并通过工厂函数填充范围变量。变量初始化正确,我在屏幕上获得了正确的数据,但我正在努力让数据自动绑定

编辑以获取其他注释: 此代码位于Factory中的原因是我计划跨多个视图使用Factory数据

以下是我到目前为止的情况:

App.factory('metrics', function($http, $q, $timeout){
    var service;
    var users = [{laps:[]}];
    var updateMetrics = function(){
        //updates the users array in the factory
    };
    service.load = function (){
        var deferred = $q.defer();

        $http.get('http://www.example.com/api/random').success(function(data) {
            var temp_array = data.split("\n");
            updateMetrics(0, temp_array);
            deferred.resolve({status: 'good'});
            $timeout(service.load,3000);
        });
        return deferred.promise;
    };

    service.lastLapInfo = function(){
        var lastlap = [];
        for (var i=0; i<users.length;i++)
        {
            var lap = users[i].laps[users[i].laps.length-1];
            lastlap.push(lap);
        }
        return lastlap;
    };
    return service;
});

App.controller('mainController', function($scope, metrics) {
    metrics.load().then(function(response){
        $scope.$watch(function () { return metrics.lastLapInfo() }, function (newVal, oldVal) {
            if (newVal !=oldVal)
            {
                $scope.users=metrics.lastLapInfo();
            }
        });
    });
});
App.factory('metrics',函数($http,$q,$timeout){
var服务;
var用户=[{laps:[]}];
var updateMetrics=函数(){
//更新工厂中的用户阵列
};
service.load=函数(){
var deferred=$q.deferred();
$http.get('http://www.example.com/api/random)。成功(函数(数据){
var temp_array=data.split(“\n”);
updateMetrics(0,临时数组);
延迟。解决({状态:'良好'});
$timeout(service.load,3000);
});
回报。承诺;
};
service.lastLapInfo=函数(){
var lastlap=[];

对于(var i=0;i如果您没有100%地使用
$watch
,我更喜欢的模式是绑定的新实例(而不是引用)将模块设置为当前范围,并严格将控制器作为用于将项目视图和模型连接在一起的组件。这不包括使用
$watch
,甚至不包括跨模块协调数据。我更喜欢在mod中使用
$rootScope
$broadcast
$emit
$on
方法ules/工厂(作为一项服务传入
$rootScope
后,它可能适用于所有情况,也可能不适用于所有情况,尽管它适用于我遇到的所有情况),而不是相对缓慢的
$watch
$watchCollection
方法。使用后者会让我感到内心肮脏……但我离题了

在你的情况下,你想做以下工作吗

App.factory('metrics', function($http, $q, $timeout){
    var service;
    service.users = [{laps:[]}];
    service.updateMetrics = function(){
        // updates the users array in the current instance of `metrics`
        // ex:
        // this.users = updatedMetrics;
        // don't do:
        // service.users = updatedMetrics;
    };
    service.load = function (){
        var deferred = $q.defer();

        $http.get('http://www.example.com/api/random').success(function(data) {
            var temp_array = data.split("\n");
            this.updateMetrics(0, temp_array);
            deferred.resolve({status: 'good'});
            $timeout(service.load,3000);
        }.bind(this));
        return deferred.promise;
    };

    service.lastLapInfo = function(){
        var lastlap = [];
        for (var i=0; i<this.users.length;i++)
        {
            var lap = this.users[i].laps[this.users[i].laps.length-1];
            lastlap.push(lap);
        }
        return lastlap;
    };
    return service;
});

App.controller('mainController', function($scope, metrics) {
    $scope.metrics = angular.copy(metrics);

    $scope.metrics.load();

});
App.factory('metrics',函数($http,$q,$timeout){
var服务;
service.users=[{laps:[]}];
service.updateMetrics=函数(){
//更新“metrics”当前实例中的用户数组`
//例:
//this.users=updateMetrics;
//不要做:
//service.users=updateMetrics;
};
service.load=函数(){
var deferred=$q.deferred();
$http.get('http://www.example.com/api/random)。成功(函数(数据){
var temp_array=data.split(“\n”);
此.updateMetrics(0,临时数组);
延迟。解决({状态:'良好'});
$timeout(service.load,3000);
}.约束(这个);
回报。承诺;
};
service.lastLapInfo=函数(){
var lastlap=[];

对于(var i=0;iIs您在
$service.load
中的键入(在
service
前面加
$
)也出现在您的项目中?抱歉-语法在项目中是正确的,但在复制/粘贴过程中一定弄错了。我编辑了问题以解决问题。老实说,我愿意接受任何可行的选项。我查看了代码,但我不确定extend在这种情况下如何工作。从阅读angular文档来看,我似乎不知道hat extend只是将对象从源复制到目标。此外,在上面的回答中,我们似乎有一个额外的参数(true)。您能给我一个快速的概述吗?我已经将代码更改为使用
角度。复制
而不是jQuery的
扩展
方法,这是完全可互换的(据我所知)。答案已编辑为概述。+1用于利用现有的AngularJS事件总线($rootscope)为此,@WalterRoman-我刚刚意识到这一点,但应该在前面提到-此代码位于工厂中的原因是因为我希望在多个视图中使用数据。创建度量的新实例不会阻止我在视图中使用同一工厂吗?