Angular 服务未更新控制器
Angular services not updating controllers
我在 angular 中使用控制器和服务。据我了解,在通过控制器之间的服务共享日期的情况下,我有责任更新服务,因为它没有范围。我在输入字段上设置了监视并在输入更改时更新了服务。为什么另一个控制器中的服务没有更新?它是一个单例并且有一个实例..不应该更新另一个控制器中的引用吗?我找到的唯一解决方案是添加一个手表来监听服务和模型的变化,但现在我每个控制器都有两个手表功能来监听两种方式。这个对吗?我觉得如果我更新服务,该值应该在另一个控制器中更新,因为所有内容都指向相同的值。
https://jsfiddle.net/86hry8a5/
<div ng-controller="mainController as mainCtrl">
<div>
<input type="text" ng-model="mainCtrl.message" />
</div>
<div>
{{mainCtrl.message}}
</div>
</div>
<hr/>
<div ng-controller="secondController as secondCtrl">
<div>
<input type="text" ng-model="secondCtrl.message" />
</div>
<div>
{{secondCtrl.message}}
</div>
</div>
.controller('mainController', function(mainService, $scope){
var self = this;
self.message = mainService.message;
$scope.$watch(function(){return mainService.message}, function(){
self.message = mainService.message;
});
$scope.$watch(function(){return self.message}, function(){
mainService.message = self.message;
});
})
.controller('secondController', function(mainService, $scope){
var self = this;
self.message = mainService.message;
$scope.$watch(function(){return mainService.message}, function(){
self.message = mainService.message;
});
$scope.$watch(function(){return self.message}, function(){
mainService.message = self.message;
});
})
.service('mainService', function(){
var self = this;
self.message = 'service';
}
);
更新服务中的值不会自动更新第二个控制器中的值,因为第二个控制器不'watching'用于更改服务值。
为了实现您正在寻找的目标,您必须创建自己的 'watch',就像您已经完成的那样。
但是,更好的方法是发出事件。每个控制器在更新服务中的值时都会发出一个事件。另一个控制器将监听此事件并更新它的本地副本。
像这样在输入框上使用ng-change
:
<input type="text" ng-model="mainCtrl.message" ng-change="mainCtrl.changeHandler()" />
发送和订阅事件的两个控制器中的控制器代码:
self.changeHandler = function () {
mainService.message = self.message;
$rootScope.$broadcast('MAIN_SERVICE_VALUE_CHANGED');
};
$rootScope.$on('MAIN_SERVICE_VALUE_CHANGED', function () {
self.message = mainService.message;
});
Here is a working fork of your fiddle updated with event logic
Why does this only work with reference to an object? and not just a property in the service?
引用 是指向内存中对象的实体。当一个函数 returns 一个 对象引用 时,每个控制器获得相同的指针。
对象的内容由所有控制器共享。 内容的更改会被所有控制器看到。
使用 primitives 仅传输 value。所有控制器都看不到后续更改。
另见,JavaScript Pass Object as a Reference
我在 angular 中使用控制器和服务。据我了解,在通过控制器之间的服务共享日期的情况下,我有责任更新服务,因为它没有范围。我在输入字段上设置了监视并在输入更改时更新了服务。为什么另一个控制器中的服务没有更新?它是一个单例并且有一个实例..不应该更新另一个控制器中的引用吗?我找到的唯一解决方案是添加一个手表来监听服务和模型的变化,但现在我每个控制器都有两个手表功能来监听两种方式。这个对吗?我觉得如果我更新服务,该值应该在另一个控制器中更新,因为所有内容都指向相同的值。
https://jsfiddle.net/86hry8a5/
<div ng-controller="mainController as mainCtrl">
<div>
<input type="text" ng-model="mainCtrl.message" />
</div>
<div>
{{mainCtrl.message}}
</div>
</div>
<hr/>
<div ng-controller="secondController as secondCtrl">
<div>
<input type="text" ng-model="secondCtrl.message" />
</div>
<div>
{{secondCtrl.message}}
</div>
</div>
.controller('mainController', function(mainService, $scope){
var self = this;
self.message = mainService.message;
$scope.$watch(function(){return mainService.message}, function(){
self.message = mainService.message;
});
$scope.$watch(function(){return self.message}, function(){
mainService.message = self.message;
});
})
.controller('secondController', function(mainService, $scope){
var self = this;
self.message = mainService.message;
$scope.$watch(function(){return mainService.message}, function(){
self.message = mainService.message;
});
$scope.$watch(function(){return self.message}, function(){
mainService.message = self.message;
});
})
.service('mainService', function(){
var self = this;
self.message = 'service';
}
);
更新服务中的值不会自动更新第二个控制器中的值,因为第二个控制器不'watching'用于更改服务值。
为了实现您正在寻找的目标,您必须创建自己的 'watch',就像您已经完成的那样。
但是,更好的方法是发出事件。每个控制器在更新服务中的值时都会发出一个事件。另一个控制器将监听此事件并更新它的本地副本。
像这样在输入框上使用ng-change
:
<input type="text" ng-model="mainCtrl.message" ng-change="mainCtrl.changeHandler()" />
发送和订阅事件的两个控制器中的控制器代码:
self.changeHandler = function () {
mainService.message = self.message;
$rootScope.$broadcast('MAIN_SERVICE_VALUE_CHANGED');
};
$rootScope.$on('MAIN_SERVICE_VALUE_CHANGED', function () {
self.message = mainService.message;
});
Here is a working fork of your fiddle updated with event logic
Why does this only work with reference to an object? and not just a property in the service?
引用 是指向内存中对象的实体。当一个函数 returns 一个 对象引用 时,每个控制器获得相同的指针。
对象的内容由所有控制器共享。 内容的更改会被所有控制器看到。
使用 primitives 仅传输 value。所有控制器都看不到后续更改。
另见,JavaScript Pass Object as a Reference