Javascript 控制器之间共享服务的脏检查,一种方式有效,另一种方式无效?

Javascript 控制器之间共享服务的脏检查,一种方式有效,另一种方式无效?,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,在试图回答一个关于在两个独立控制器之间共享数据的问题时,我遇到了一个问题 我通常使用服务来完成这项任务,并开始创建一个JSFIDLE,但我无法让它工作 如果我在setActivePersonWorks(person)中动态创建属性,经过一点调试后,脏检查工作正常,第二个控制器显示了正确的值 如果我在setactivepersondoesnowork()中指定了该值,则不会 如果我使用$timeout()我能够验证DataService.badPerson确实包含正确的数据 我做错什么了吗?我想如

在试图回答一个关于在两个独立控制器之间共享数据的问题时,我遇到了一个问题

我通常使用服务来完成这项任务,并开始创建一个JSFIDLE,但我无法让它工作

如果我在
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);
}