控制器之间共享服务的脏检查,一种方法有效,另一种方法无效
Dirty checking with shared service between controllers, One way works the other does not?
在试图回答关于在两个单独的控制器之间共享数据的问题时,我遇到了一个问题。
我通常使用服务来完成这个任务,并开始创建一个jsfiddle,但我无法让它工作。
经过一些调试,如果我在setActivePersonWorks(person)
中动态创建属性,脏检查工作,第二个控制器显示正确的值。
如果我在setActivePersonDoesNotWork()
中赋值,它没有。
如果我使用$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);
}
<html/>
<div ng-app="MyTest">
<div ng-controller="ViewController"></div>
<div ng-controller="DetailController">
<h1>Works: {{goodPerson.name}}</h1>
<h1>Does Not Work: {{badPerson.name}}</h1>
{{message}}
</div>
</div>
在jsfiddle 当Angular看到
<h1>Does Not Work: {{badPerson.name}}</h1>
在对象badPerson
上设置$watch。看看您的控制器,$scope.badPerson
是对对象DataService.badPerson
的引用。到目前为止一切都很好……问题发生在这里:
setActivePersonDoesNotWork: function (person) {
People.badPerson = person;
}
当这个函数执行时,badPerson
被分配了一个新的/不同的对象引用,但是控制器仍然$监视旧的/原始的对象引用。
修复方法是使用angular.copy()来更新现有的badPerson
对象,而不是分配一个新的引用:
setActivePersonDoesNotWork: function (person) {
angular.copy(person, People.badPerson);
}
这也解释了为什么setActivePersonWorks()
工作——它不分配一个新的对象引用
相关文章:
- 为什么方法.options对select无效
- Web 服务方法名称无效
- 修复无效JSON的最有效方法
- JavaScript 方法一个有效,另一个无效
- GWT JSNI 方法与本机 JS:“无效标签”
- 错误:参数 4 的值无效.属性“方法”:意外属性
- JQuery 不返回值?或者该方法无效
- 如果对 JSONP 请求的服务器响应未正确包装在函数中,是否有任何方法可以覆盖“无效标签”错误
- 使用atob()方法时出现无效字符错误
- 这些在JavaScript中向现有对象添加属性的方法有何不同(一种有效,一种无效)
- 重置方法对流星对象无效
- 从对象中取出具有无效(NaN、blank等)值的键的最佳方法
- 将无效日期转换为时间对象的最简单方法
- 用jquery预处理html的一种方法有效,但为什么另一种方法无效't
- 控制器之间共享服务的脏检查,一种方法有效,另一种方法无效
- 向drupal服务器发送JSON会导致无效方法;在目标C中
- 为什么Date.parse()方法对无效字符串"foo 01.01.01"有效
- Angular -无效模型值的解决方法
- 不能使输入无效(对象不支持属性或方法'$setValidity')
- 使用Last进行身份验证.提供了无效的方法签名