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