Проектирование AngularJS приложений
В Ангуляре любое изменение производится через область видимости (scope). Просто так, даже стиль у элемента не сменить. И это здорово.
Тем не менее, при проектировании можно использовать две стратегии: 1. Напрямую менять модель из представления, а потом все изменения вотчить. Атрибуты будут выглядеть преимущественно так: ng-click="model.param=true" и вся дальнейшая работа происходит в контроллере, наблюдающем за model 2. Вызывать из представления функции контроллера. Атрибуты будут выглядеть преимущественно так: ng-click="changeParam()" и вся последующая работа будет происходить в соответствующем методе контроллера. Пока пользуюсь первым способом, который интуитивно мне ближе, но хотелось бы услышать мнение со стороны. |
Глубоко убеждён, что всю логику лучше хранить в контроллерах/директивах. То есть оставить представлению только функции собственно представления данных и реагирования на действия пользователя. То есть я за пункт 2.
Очевидные плюсы: - убираем лишнюю логику из представления. смотря на код контроллера, нам не нужно дополнительно думать, что какое-то значение может быть изменено в каком-то из представлений. - сразу избавляемся от колбасы из $watch'ей в контроллере, на смену которым приходят короткие и ясные функции. - что-то мне подсказывает, что дёрнуть один раз функцию контроллера будет гораздо менее ресурсозатратно, чем постоянно мониторить значение dirty checking'ом. |
То же самое мне советовали в списке рассылки. Уже отказался от своего способа. Недавно даже сделал пример со сравнением подходов: http://www.angular.ru/cookbook/watcharray
|
Пример с $watch по ссылке не работает. :)
|
Это издержки тамошнего движка обработки примеров. Уже починил, теперь работает :-)
|
Если нужна наглядность, можно присваивать функции прямо в this конструктора контроллера и возвращать скоуп.
var app = angular.module('app', []); app.controller('MyCtrl', function($scope) { this.hello = function() { alert('Ssssssssssssssss'); }; return $scope.MyCtrl = this; }); Затем во вьюшке сразу видно, из какого контроллера вызывается функция (чтобы не подглядывать в роутинг): <p data-ng-click="MyCtrl.hello()">Click here</p> Подглядел у этого парня |
Цитата:
|
Часовой пояс GMT +3, время: 00:56. |