Javascript 如何将工厂更新应用于视图
我正在尝试以asyn模式更改工厂中的引用,但在我的视图中看不到已更新的更改 看法 工厂Javascript 如何将工厂更新应用于视图,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我正在尝试以asyn模式更改工厂中的引用,但在我的视图中看不到已更新的更改 看法 工厂 angular.module('test').factory('Service', function($rootScope) { var Service = function() { this.Current = { Messages: [] }; this.Socket = io.connect(/* ... */); } Service.prototype.asyncEven
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()
而不是更改引用时,它运行良好,因此我知道问题与异步无关。
但是,我不知道如何使用从我的工厂到我的视图的引用,并且能够随时更改我指向的对象。您的问题是,通过执行
this.Current=other,您正在用新对象引用覆盖Current
代码>,因此,$scope.Current
@$scope.Current=Service.Current
持有的当前引用具有旧的对象引用。所以它不会被反射。您可以引入多个对象层次结构来解决此问题,特别是当您从服务公开属性并且希望消费者将其用作活动属性时,您可以共享一个不变的引用
作为您案例中的一个简单修复,您可以执行this.Current.Messages=other.Messages代码>而不是this.Current=另一个
,这样您在服务实例化期间不会更改由serviceInstance.Current
属性保留的引用,而是只更改Messages数组
尝试:-
但是,当您从服务中公开属性时,应该小心,它很容易被其他使用者(控制器)意外或以其他方式覆盖,并且可能会导致应用程序中的数据完整性问题。相反,公开方法,实现承诺模式来传递数据,甚至可以使用发布/订阅模式(甚至使用angular内置事件总线)让使用者知道事件的发生。当前服务.Current.Message的消息属性在哪里?或者你的意思是更新后的$scope.Current=Service.Current
,$scope.Current
有消息,而你在视图中执行的是Current.Messages?@PSL你是对的,我更新了我的帖子。而不是执行this.Current=other代码>执行this.Current.Messages=other.Messages时会发生什么代码>这解决了问题吗?效果很好,谢谢!我也不喜欢这种方法,你能告诉我,在这种情况下,我如何实现承诺模式吗?谢谢你的帮助@太好了!!既然这回答了你的具体问题,你介意接受它吗。对于您的问题,谁执行异步事件?基本上我所说的是,您的一个组件引发刷新数据的事件,对吗?另一个组件可以捕获相同的事件,它告诉它获取刷新的数据,这将是您的getData方法,它返回一个与数据解析的承诺。
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;
});
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;
});