изменение объектов модели внутри контроллеров для управления DOM - angular js - лучшие практики?

У меня есть простой вопрос после прочтения поста ниже и работы в течение некоторого времени над angular js.

сообщение: никаких манипуляций с домом из контроллеров angular js

Соответствующий пункт (из сообщения): Не используйте контроллеры для
манипулирования DOM — контроллеры должны содержать только бизнес-логику. Размещение любой логики представления в контроллерах существенно влияет на ее тестируемость. Angular имеет привязку данных для большинства случаев и директивы для инкапсуляции ручных манипуляций с DOM.


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

Как это сделать лучше всего?

Мой текущий способ сделать это: ПРИМЕР ПЛАНКЕРА (нарушает ли этот способ действия закон в angular js царство. Это против тестирования? Пожалуйста, поправьте меня)


person ankur    schedule 30.03.2014    source источник
comment
То, что вы делаете, прекрасно. Вы хотите избежать кода, подобного if ( $scope.isAdmin ) $('#password').show();, в вашем контроллере.   -  person dave    schedule 30.03.2014
comment
Я бы переместил логику кнопки сброса в функцию в области действия контроллера, чтобы упростить тестирование, как у вас с checkLoginName. В противном случае это выглядит хорошо.   -  person tasseKATT    schedule 30.03.2014
comment
спасибо, но разве это не ухудшит читаемость, как jquery.i означает, что вызывается какая-то функция и некоторые изменения модели (что неизбежно), а затем внезапно какой-то div/button исчезает. Я имею в виду, что я прекрасно справлюсь с тем, как я это сделал, и забуду об этих сомнениях.   -  person ankur    schedule 30.03.2014


Ответы (1)


В рекомендациях Angular не говорится «не используйте контроллеры для управления домом» в том смысле, что вы никогда не должны изменять дом в результате чего-то в контроллере, а скорее что вы никогда не должны в контроллере напрямую изменять дом . Не используйте document.getElementById, не используйте $("#element") и т. д. - никогда не разговаривайте с домом, пусть ваша модель позаботится об этом, привязав модель к дому.

Когда вы обнаружите, что хотите использовать jQuery для связи с домом непосредственно в контроллере, самое время взглянуть на директивы. http://docs.angularjs.org/guide/directive

И я согласен с @tasseKATT, переместите код ng-click в код кнопки сброса в функцию - хотя бы просто для здравомыслия.

изменить

Это можно проверить? Да, гораздо больше, чем встраивание вещей в HTML или непосредственное использование/изменение DOM.

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

Насколько проще писать этот тип кода встроенным или в document.ready и т. Д. - это всего лишь часть привыкания к способу ведения дел Angular. Исходя из многолетнего опыта работы с jQuery, к этому определенно нужно привыкнуть. Я бы сказал, что труднее сделать это «старым» способом.

Ознакомьтесь с сообщениями на этом сайте, посвященными тестированию Angular — там есть статьи о тестировании контроллеров, директив, сервисов и т. д. — они действительно помогли мне собрать все это воедино. http://www.benlesh.com/2013/05/angularjs-unit-testing-controllers.html

person brianj    schedule 02.04.2014
comment
хорошо, я понял... несколько вопросов.. 1. этот способ изменить вашу модель и отразить ее через ng-shows/ng-hides/toggles - это ПРОВЕРКА или НЕТ (потому что я боюсь, что наступит момент, когда эти функции будут вызываться, что, в свою очередь, вызовет еще несколько функций, которые приведут к отображению/скрытию некоторого элемента dom - обратите внимание: мой страх - это не результат, а способность к тестированию)..... 2. мне легко написать их встроенными, так как это увеличивает читабельность по сравнению с перемещением их в функцию.. ДОЛЖЕН ли я изменить эту практику? - person ankur; 03.04.2014