我目前正在使用 AngularJS。我想从服务返回一个变量,让作用域知道它何时发生变化。
为了说明这一点,请查看 www.angularjs.org 中的示例“连接后端”。粗略地,我们可以看到以下内容:
var projects = $firebase(new Firebase("http://projects.firebase.io"));
$scope.projects = projects;
此后,所有更新均对projects
对象(通过更新,无论是本地还是远程)将自动反映在范围绑定到的视图上。
我怎样才能在我的项目中实现同样的目标?就我而言,我想从服务返回一个“自我更新”变量。
var inbox = inboxService.inboxForUser("fred");
$scope.inbox = inbox;
哪些机制可以让$scope
知道它应该更新吗?
EDIT:为了响应这些建议,我尝试了一个基本的例子。我的控制器:
$scope.auto = {
value: 0
};
setInterval(function () {
$scope.auto.value += 1;
console.log($scope.auto.value);
}, 1000);
而且,在我看来:
<span>{{auto.value}}</span>
尽管如此,它只显示 0。我做错了什么?
UPDATE:
我做了一个演示插件:http://plnkr.co/edit/dmu5ucEztpfFwsletrYW?p=preview http://plnkr.co/edit/dmu5ucEztpfFwsletrYW?p=preview
I use $timeout
伪造更新。
诀窍是使用纯 JavaScript 引用:
- 您需要将一个对象传递到作用域。
- 您不得覆盖该对象,而只能更新或扩展它。
- 如果你覆盖它,你就会失去“绑定”。
- 如果你使用
$http
它会为您触发摘要。
- 因此,每当发生更改时,范围变量都会引用在服务中更新的同一对象,并且所有观察者都将收到摘要通知。
- AFAIK,就是这样
$firebase
& Restangular
work.
- 如果您进行多次更新,则需要有一种重置属性的方法。
- 由于您在整个应用程序中持有对对象的引用,因此您需要注意内存泄漏。
例如:
Service:
app.factory('inboxService', function($http){
return {
inboxForUser: function(user){
var inbox = {};
$http.get('/api/user/' + user).then(function(response){
angular.extend(inbox, response.data);
})
return inbox;
}
};
});
控制器:
app.controller('ctrl', function(inboxService){
$scope.inbox = inboxService.inboxForUser("fred");
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)