我在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;
}
});
}]);
答案 0 :(得分:1)
这是预期的,因为profile
的使用者具有对创建的初始对象的引用。因此,如果您通过profile.firstName = 'bob'
更新对象,则表示您正在更新同一个对象。但是,当您通过profile = {firstname: 'bob'}
设置配置文件时,您在使用花括号时创建了一个全新的对象,并且第一个配置文件对象的任何使用者都不知道新的对象。
解决此问题的一种方法是使用$watch
,但出于性能原因,通常最好避免使用$watch
。
要记住的是,所有角度工厂/服务都是单身人士。因此,当您刚接触Angular时,您可能希望每次控制器启动时都会注入新的currentUser
,而实际上所有注入都引用了同一个currentUser
实例。