Недавно я обнаружил, что Javascript является «Call by sharing» (пояснение по википедии), что означает, что по сути все передается по значению, однако исходное содержимое объекта все равно может быть изменено. Быстрый пример:
function changeObjectProperties(obj) {
obj.p = 20;
}
var obj = { p: 10; }
changeObjectProperties(obj);
console.log(obj.p); // will print 20; it's changed!
Это заставил меня задаться вопросом, если это может быть использовано в угловатом «смотреть» переменные без использования $ Сферы $ часов.. Следующие работы.
controllers.js:
.controller('Listener', function($scope, UserService) {
$scope.user = UserService.getUser();
})
.controller('Changer', function($scope, UserService) {
// let's imagine the UI has some button that changes the e-mailadres
$scope.buttonClick = function() {
UserService.setEmail('[email protected]');
}
});
services.js:
.factory('UserService', function() {
var user = {
name: 'Foo',
email: '[email protected]'
};
return {
getUser: function() { return user; }
setEmail: function(email) { user.email = email; }
};
});
$scope.user
переменная в контроллере Listener
обновляется, когда пользователь нажимает на кнопку в контроллере Changer
. Это изменение видно, будет ли эта переменная отображаться в HTML.
Самым очевидным недостатком является то, что сам объект не может быть изменен, так как ссылка на объект затем изменяется, а контроллер Listener
слушает неправильную ссылку.
Я искал вокруг, чтобы узнать, выполняется ли это, и если это считается хорошим кодированием. Я ничего не смог найти, возможно, потому, что не знаю правильных условий использования. Итак, активно ли этот метод используется? Является ли это хорошей практикой или есть какая-то ошибка, о которой я не знаю?
Какую технику вы имеете в виду? И где вы видите соединение с '$ watch'? – zeroflagL
«Техника» просмотра «переменной», как показано выше. Изменение электронной почты, выполняемое контроллером «Чейнджер», подбирается контроллером «Listener». Обычно это делается с использованием $ scope. $ Watch, но, по-видимому, это возможно и без. – Ssander
Я вижу. Ну, контроллер ** не знает **, что адрес электронной почты изменился. Вот что такое '$ watch' для: Чтобы получить информацию. – zeroflagL