Я работаю в Угловом. Я создал простой сервис, чтобы проиллюстрировать проблему, которую я вижу. Когда кто-то вызывает метод 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;
}
});
}]);
Итак, переменные указывают на литералы объектов, указывающие на ссылку или значение? Если бы это было по значению, это имело бы смысл, иначе это не так. Потому что, если это по ссылке, это означает, что моя фабрика вернула объект, у которого есть свойство профиля, которое ссылается на внутреннее свойство, которое ссылается на литерал объекта. Поэтому обновление объекта внутреннего профиля к новому объекту будет просто обновлять ссылку. Я что-то упускаю? – spoof3r
Оба;) Возможно, это будет иметь больше смысла: http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language – Ryan
Вау, у меня не было идея! Как я использовал JS так долго, не зная об этом? Огромное спасибо!!! – spoof3r