Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Проектирование AngularJS приложений (https://javascript.ru/forum/angular/38321-proektirovanie-angularjs-prilozhenijj.html)

Shitbox2 28.05.2013 03:51

Проектирование AngularJS приложений
 
В Ангуляре любое изменение производится через область видимости (scope). Просто так, даже стиль у элемента не сменить. И это здорово.

Тем не менее, при проектировании можно использовать две стратегии:

1. Напрямую менять модель из представления, а потом все изменения вотчить. Атрибуты будут выглядеть преимущественно так: ng-click="model.param=true" и вся дальнейшая работа происходит в контроллере, наблюдающем за model

2. Вызывать из представления функции контроллера. Атрибуты будут выглядеть преимущественно так: ng-click="changeParam()" и вся последующая работа будет происходить в соответствующем методе контроллера.

Пока пользуюсь первым способом, который интуитивно мне ближе, но хотелось бы услышать мнение со стороны.

gorpacrate 02.06.2013 12:53

Глубоко убеждён, что всю логику лучше хранить в контроллерах/директивах. То есть оставить представлению только функции собственно представления данных и реагирования на действия пользователя. То есть я за пункт 2.

Очевидные плюсы:
- убираем лишнюю логику из представления. смотря на код контроллера, нам не нужно дополнительно думать, что какое-то значение может быть изменено в каком-то из представлений.
- сразу избавляемся от колбасы из $watch'ей в контроллере, на смену которым приходят короткие и ясные функции.
- что-то мне подсказывает, что дёрнуть один раз функцию контроллера будет гораздо менее ресурсозатратно, чем постоянно мониторить значение dirty checking'ом.

Shitbox2 02.06.2013 23:56

То же самое мне советовали в списке рассылки. Уже отказался от своего способа. Недавно даже сделал пример со сравнением подходов: http://www.angular.ru/cookbook/watcharray

gorpacrate 03.06.2013 13:29

Пример с $watch по ссылке не работает. :)

Shitbox2 03.06.2013 17:04

Это издержки тамошнего движка обработки примеров. Уже починил, теперь работает :-)

Vhornets 03.06.2013 20:29

Если нужна наглядность, можно присваивать функции прямо в 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>


Подглядел у этого парня

Shitbox2 04.06.2013 17:45

Цитата:

Сообщение от Vhornets (Сообщение 254321)
Подглядел у этого парня

Что-то ссылка не работает...


Часовой пояс GMT +3, время: 18:07.