Javascript 控制器之间共享服务的脏检查,一种方式有效,另一种方式无效?
在试图回答一个关于在两个独立控制器之间共享数据的问题时,我遇到了一个问题 我通常使用服务来完成这项任务,并开始创建一个JSFIDLE,但我无法让它工作 如果我在Javascript 控制器之间共享服务的脏检查,一种方式有效,另一种方式无效?,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,在试图回答一个关于在两个独立控制器之间共享数据的问题时,我遇到了一个问题 我通常使用服务来完成这项任务,并开始创建一个JSFIDLE,但我无法让它工作 如果我在setActivePersonWorks(person)中动态创建属性,经过一点调试后,脏检查工作正常,第二个控制器显示了正确的值 如果我在setactivepersondoesnowork()中指定了该值,则不会 如果我使用$timeout()我能够验证DataService.badPerson确实包含正确的数据 我做错什么了吗?我想如
setActivePersonWorks(person)
中动态创建属性,经过一点调试后,脏检查工作正常,第二个控制器显示了正确的值
如果我在setactivepersondoesnowork()
中指定了该值,则不会
如果我使用$timeout()
我能够验证DataService.badPerson
确实包含正确的数据
我做错什么了吗?我想如果您使用$apply()
执行某些操作,它将正常工作,但是为什么动态创建值会导致工作正常
工作示例:
var myTest = angular.module("MyTest", []);
myTest.factory("DataService", function () {
var People = {
goodPerson: {},
badPerson: {},
setActivePersonWorks: function (person) {
People.goodPerson.name = person.name;
People.goodPerson.id = person.id;
},
setActivePersonDoesNotWork: function (person) {
People.badPerson = person;
}
};
return People;
});
function ViewController($scope, DataService, $timeout) {
$timeout(function () {
DataService.setActivePersonWorks({
id: 1,
name: "Good Mark"
});
DataService.setActivePersonDoesNotWork({
id: 2,
name: "Bad Mark"
});
}, 1000);
}
function DetailController($scope, DataService, $timeout) {
$scope.goodPerson = DataService.goodPerson;
$scope.badPerson = DataService.badPerson;
$timeout(function(){
$scope.message = "DataService has the value: " + DataService.badPerson.name + " but $scope.badPerson is " + $scope.badPerson.name;
}, 2000);
}
作品:{{goodPerson.name}
不工作:{{badPerson.name}
{{message}}
当角度
<h1>Does Not Work: {{badPerson.name}}</h1>
执行此函数时,badPerson
被分配一个新的/不同的对象引用,但控制器仍在监视旧的/原始的对象引用
修复程序用于更新现有的badPerson
对象,而不是分配新的引用:
setActivePersonDoesNotWork: function (person) {
angular.copy(person, People.badPerson);
}
这也解释了为什么
setActivePersonWorks()
有效——它不分配新的对象引用。太棒了!感谢您的修复和解释。
setActivePersonDoesNotWork: function (person) {
People.badPerson = person;
}
setActivePersonDoesNotWork: function (person) {
angular.copy(person, People.badPerson);
}