Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Isolated scope в select (https://javascript.ru/forum/angular/42154-isolated-scope-v-select.html)

Olival888 15.10.2013 11:13

Isolated scope в select
 
Доброго времени суток!
Возникла проблема.
Решил я написать хорошую директиву для генерации и вывода сообщений валидации. Для корректной работы директива должна создавать себе изолированную область видимости. И все бы хорошо, но в таком случае перестает нормально работать ng-options в select.
Вот фидл всего этого безобразия (эффект видно, если раскомментировать "//scope: {}").
На stackoverflow.com были пара вопросов на эту тему, но к здравому и всех устраивающему решению так и не пришли.
Пост 1
Пост 2

В случае успешного решения обязательно выложу. Может и допилим общими усилиями )))

nerv_ 15.10.2013 12:00

А в чем вопрос?

Olival888 15.10.2013 12:27

Как сделать так, чтобы и директива и ng-options в select работали???
Как то так...

DjDiablo 15.10.2013 16:53

Как вариант переписывать ngOptions
Но проще всего написать свою директиву без изолированного scope.

Попробуй объяснить на фига тебе scope изолировать

Olival888 15.10.2013 17:12

Как то так...

Идея в том, что сначала деректива генерирует список сообщений об ошибках.
Далее - при возникновении ошибки сообщение появляется, но как напоминание (допустим серый цвет шрифта).
При исправлении - исчезает.
При сабмите сообщения о допущеных ошибках становятся более навящивы (допустим, красятся в красный).

Если не использовать Isolated scope, то при возникновении ошибки на одном поле - срабатывают все сообщения.

DjDiablo 15.10.2013 18:59

Вот неплохая статья по теме валидации форм.
http://habrahabr.ru/post/179473/

Пример из статьи 1 (стандартный валидатор)
Пример из статьи 2 (свой валидатор)
пример из статьи 3 (отключение submit для не валидных форм)

Я смутно представлю на фига нужны события, если только ради того чтобы валидацию после нажатия на submit сделать, то я не думаю что это удобно.

И даже пусть ошибки выводятся только при нажатии на submit, тоuгда пусть submit бросит событие, renderError его обработает и если есть ошибка то выведет предупреждение если нет ошибки то спрячет предупреждение. Никаких событий в ответ renderError посылать не должен, submit и без событий может принять решение об отправке формы на основании .$invalid. Изолированный scope нафик нигде ненужен


Сорри если не понимаю задачу.

Olival888 15.10.2013 19:21

Статью читал, но она обзорная...
События в директиве именно для этого они и нужны, но, даже если их удалить, суть не меняется. Изоляция нужна так или иначе...
И, что самое противное, проблема только с ng-options. Переписать не вариант - сильно уж она хитро сделана.
Нужен какой то обходной маневр, вот только я не знаю какой
А если судить по stackoverflow - вообще мало кто знает или знают, но молчат ))))

DjDiablo 15.10.2013 19:47

Тебе никто и не ответит,
в примере http://jsfiddle.net/drRKk/ чо попало написано.

К примеру вмето того чтобы просто вызвать метод requireErrorEnable(), ты используешь события почему то
scope.$emit("requireErrorEnable"); 
scope.$on("requireErrorEnable",function(){});

Если делать это через жопу через события то естественно requireErrorEnable сработает во всех рендерах, а если как функцию то только в том в какой должен. Пока что я вижу что ты используешь изолированный scope только для того чтобы вызывать requireErrorEnable через анальное отверстие, так как изолированный scope позволяет срабатывать событию в рамках одной директивы а не расползаться по всему scope формы. А нужно лиш отказаться от событий внутри директивы, и необходимость изолировать scope исчезнет

Я понять не могу что ты хочешь добится и ничего особо не менял, просто убрал события и изолированный scope чтобы показать что и без него error выводится только в редактируемом input http://jsfiddle.net/xtBXe/

В общем вывод такой что я по прежнему не вижу оснований для изоляции scope.

tulov_alex 15.10.2013 20:55

Цитата:

Сообщение от Olival888 (Сообщение 276519)
Доброго времени суток!
Возникла проблема.
Решил я написать хорошую директиву для генерации и вывода сообщений валидации. Для корректной работы директива должна создавать себе изолированную область видимости. И все бы хорошо, но в таком случае перестает нормально работать ng-options в select.
Вот фидл всего этого безобразия (эффект видно, если раскомментировать "//scope: {}").
На stackoverflow.com были пара вопросов на эту тему, но к здравому и всех устраивающему решению так и не пришли.
Пост 1
Пост 2

В случае успешного решения обязательно выложу. Может и допилим общими усилиями )))

Не ясно для чего вообще огород с директивой городить. Гораздо проще подобная задача решается использованием базовых средств angular для работы с формой (классы ng-valid, ng-invalid, ng-dirty и подобные).

Olival888 16.10.2013 11:48

Цитата:

Сообщение от DjDiablo (Сообщение 276582)
Тебе никто и не ответит,
в примере http://jsfiddle.net/drRKk/ чо попало написано.

К примеру вмето того чтобы просто вызвать метод requireErrorEnable(), ты используешь события почему то
scope.$emit("requireErrorEnable"); 
scope.$on("requireErrorEnable",function(){});

Если делать это через жопу через события то естественно requireErrorEnable сработает во всех рендерах, а если как функцию то только в том в какой должен. Пока что я вижу что ты используешь изолированный scope только для того чтобы вызывать requireErrorEnable через анальное отверстие, так как изолированный scope позволяет срабатывать событию в рамках одной директивы а не расползаться по всему scope формы. А нужно лиш отказаться от событий внутри директивы, и необходимость изолировать scope исчезнет

Я понять не могу что ты хочешь добится и ничего особо не менял, просто убрал события и изолированный scope чтобы показать что и без него error выводится только в редактируемом input http://jsfiddle.net/xtBXe/

В общем вывод такой что я по прежнему не вижу оснований для изоляции scope.

Спасибо!!!
Вроде помогло!
Осталось только попробовать в боевых условиях )


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