AngularJS - включенная область с дочерними областями действия

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

<form-container submit-path="/path/to/api/">
    <input-field label="Foo"></input-field>
    <select-field label="Bar"></select-field>
</form-container>

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

- (1) form-container isolate scope
- (2) form-container transcluded scope
  - (3) input-field scope
  - (4) select-field scope

Scope (1) будет иметь функцию, которая собирает и отправляет данные из формы, но для этого потребуется доступ к данным, связанным с элементами формы в областях (3) и (4).

Это вообще возможно?

Поскольку предпочтительным способом было бы сохранить режим в scope (2), мне бы понадобилось связать поля с разными именами переменных, но не похоже, что я могу интерполировать в ng-модели с атрибутом директивы. редактировать: кажется, что я могу сделать это вручную в функции компиляции? 2-е редактирование: после исправления этой ошибки.

Кроме того, функция отправки формы не имеет прямого доступа к данным в области (2). Вы можете использовать $$nextSibling, но, очевидно, это плохая практика.

Есть ли способ получить область (3) и (4) для наследования непосредственно от области (1)?

2 ответа

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

По сути, вам не нужно связываться с закрытыми областями. Вы просто используете тег и либо ng-контроллер в форме, либо пользовательскую директиву, которая присоединяет область к тегу формы.

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

http://plnkr.co/edit/F1e1mKA2UU3EL1M9yaJ0?p=preview

Это то, что я пытался достичь, используя директиву controller и позволяя дочерней директиве обновлять значение в родительской директиве через свой контроллер.

Я поднимаю этот вопрос, поскольку не удовлетворен и хочу найти лучшее решение.

Другие вопросы по тегам