2015-01-26 2 views
4

Недавно я обнаружил, что 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 слушает неправильную ссылку.

Я искал вокруг, чтобы узнать, выполняется ли это, и если это считается хорошим кодированием. Я ничего не смог найти, возможно, потому, что не знаю правильных условий использования. Итак, активно ли этот метод используется? Является ли это хорошей практикой или есть какая-то ошибка, о которой я не знаю?

+0

Какую технику вы имеете в виду? И где вы видите соединение с '$ watch'? – zeroflagL

+0

«Техника» просмотра «переменной», как показано выше. Изменение электронной почты, выполняемое контроллером «Чейнджер», подбирается контроллером «Listener». Обычно это делается с использованием $ scope. $ Watch, но, по-видимому, это возможно и без. – Ssander

+0

Я вижу. Ну, контроллер ** не знает **, что адрес электронной почты изменился. Вот что такое '$ watch' для: Чтобы получить информацию. – zeroflagL

ответ

0

Вы можете использовать базовый язык, чтобы избежать чрезмерных часов. Имейте в виду, что вообще невозможно избежать часовых сборов, потому что часы в основном связаны с тем, как Angular отслеживает модель. Другими словами, если вы ничего не делаете, что-то помещает в область действия, это заставит Angular смотреть его, чтобы они знали, когда обновлять визуализированный пользовательский интерфейс. В этом суть цикла дайджеста. В той мере, в какой вы можете управлять своим внутренним общением вокруг того, как работает этот цикл дайджест, вы можете уменьшить или устранить накладные расходы посторонних наблюдателей.

Таким образом, вы можете использовать JavaScript-первый подход для координации состояний и внутренних переходов объектов и избегать явных наблюдателей, потому что Angular заберет изменения через свои собственные часы, которые являются частью цикла дайджеста.

Я думаю, что вы говорите о том, в соответствии с тем, что я написал в моей 2-ой наиболее распространенной ошибкой AngularJS разработчики делают, который злоупотребляя $ часы: http://csharperimage.jeremylikness.com/2014/11/the-top-5-mistakes-angularjs-developers_28.html

Смежные вопросы