Angular服务的公开对象文字没有更新?

时间:2015-08-22 06:37:38

标签: javascript angularjs

我在Angular工作。我已经创建了一个简单的服务来说明我所看到的问题。当有人在此服务上调用setProfile方法时,我的目标是设置'配置文件'到包含新属性值的新对象文字。但是,当我这样做时,看起来这个服务的消费者看不到更新。换句话说,他们会看到旧的'对象,而不是新对象。但是,如果我只更新单个属性而不是分配'配置文件'对于一个新的对象文字,他们看到更新就好了。我很困惑。

此代码有效(即在调用setProfile方法后,消费者会看到更新的值):

(function () {
angular.module('myApp').factory('myService', function () {

    var profile = {
        firstName: '',
        lastName: ''
    };

    var setProfile = function (firstName, lastName) {
        profile.firstName = firstName;
        profile.lastName = lastName;
    };

    return {
        setProfile: setProfile,
        profile: profile
    }
});
}());

但是这不起作用(即当我将配置文件分配给新的对象文字时,消费者看不到新对象):

(function () {
angular.module('myApp').factory('myService', function () {

    var profile = {
        firstName: '',
        lastName: ''
    };

    var setProfile = function (firstName, lastName) {
        profile = {
            firstName: firstName,
            lastName: lastName
        };
    };

    return {
        setProfile: setProfile,
        profile: profile
    }
});
}());

以下是如何使用该服务的示例:

module.run(['$rootScope', 'currentUser', function ($rootScope, currentUser) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
    debugger;
    if (!currentUser.firstName == 'test') {
        return;
    }
});
}]);

1 个答案:

答案 0 :(得分:1)

这是预期的,因为profile的使用者具有对创建的初始对象的引用。因此,如果您通过profile.firstName = 'bob'更新对象,则表示您正在更新同一个对象。但是,当您通过profile = {firstname: 'bob'}设置配置文件时,您在使用花括号时创建了一个全新的对象,并且第一个配置文件对象的任何使用者都不知道新的对象。

解决此问题的一种方法是使用$watch,但出于性能原因,通常最好避免使用$watch

要记住的是,所有角度工厂/服务都是单身人士。因此,当您刚接触Angular时,您可能希望每次控制器启动时都会注入新的currentUser,而实际上所有注入都引用了同一个currentUser实例。