我正在尝试在asyn模式下更改工厂中的引用,并且我没有看到更改已在我的视图中更新。
查看
<div ng-repeat="Message in Current.Messages">{{Message.text}}</div>
控制器
angular.module('test').controller('testCtrl', function($scope, Service) {
$scope.Current = Service.Current;
});
厂
angular.module('test').factory('Service', function($rootScope) {
var Service = function() {
this.Current = { Messages: [] };
this.Socket = io.connect(/* ... */);
}
Service.prototype.asyncEvent = function(Another) {
this.Socket.on('event', function() {
$rootScope.$apply(function() {
this.Current = Another; // After this change, i would like my view to display the new object but nothing happens...
}.bind(this));
});
};
var service = new Service();
return service;
});
当我尝试使用.push()
而不是更改引用时,它运行良好,所以我知道问题不是针对异步的事情。
但是我没有看到我如何使用从我的工厂到我的视图的参考,并且能够随时更改我指向的对象。
答案 0 :(得分:0)
您的问题是,您通过Current
覆盖了this.Current = Another;
的引用并引用了新的对象引用,因此$scope.Current
@ $scope.Current = Service.Current
所持有的当前引用具有旧对象参考。所以它没有得到反映。您可以引入多个对象层次结构来解决此问题,尤其是当您从服务公开属性并且您希望它被消费者用作实时属性时,您可以共享不会更改的引用。
作为一个简单的修复,您可以this.Current.Messages = Another.Messages;
代替this.Current = Another;
,这样您就不会在服务实例化期间更改serviceInstance.Current
属性所持有的引用,而是更改只有消息数组。
尝试: -
angular.module('test').factory('Service', function($rootScope) {
var Service = function() {
this.Current = { Messages: [] };
this.Socket = io.connect(/* ... */);
}
Service.prototype.asyncEvent = function(Another) {
this.Socket.on('event', function() {
$rootScope.$apply(function() {
this.Current.Messages = Another.Messages;
}.bind(this));
});
};
var service = new Service();
return service;
});
但是,当您从服务公开属性时,您应该小心,它可能会被其他消费者(控制器)意外地或其他方式覆盖,并且可能导致应用程序中的数据完整性问题。而是公开方法,实现承诺模式来传递数据,甚至可以使用pub / sub模式(甚至使用角度内置的事件总线)让消费者知道事件的发生。