2014-01-30 2 views
0

У меня есть приложение со многими формами. Каждое поле имеет несколько HTML-элементов, поэтому я подумал, что могу извлечь некоторые директивы (по одному для каждого типа поля), чтобы мои формы были аккуратными.Угловая директива вставляет неправильный узел DOM

Я создал sample app, чтобы продемонстрировать проблему, но я получаю противоречивое поведение. В примере приложения элемент <link /> заменяет <input />. В моем реальном приложении <input /> просто удаляется из DOM полностью. Я чувствую, что это должно быть легко; почему он не работает?

+0

похоже, что ваш 'ng-transclude' находится не в том месте. ng-transclude - это Директива, которая маркирует точку вставки для переводимой DOM ближайшей родительской директивы, которая использует переход. Любое существующее содержимое элемента, на которое установлена ​​эта директива, будет удалено до того, как будет вставлен переводный контент. Кажется, что содержимое элемента формы будет заменено. (Если ваш образец был функциональным). – Claies

ответ

1

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

Это, вероятно, что вы ищете:

<div class="form-group" > 
    <label for="{{htmlId}}" ng-transclude></label> 
    <input id="{{htmlId}}" class="form-control" type="text" ng-model="model" /> 
    <span ng-repeat="error in errors">{{error}}</span> 
</div> 

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

Также у вас есть несколько ошибок в вашем .js. Во-первых, вы хотите использовать = в Вашей области вместо &

scope: { 
    model: '=', 
    errors: '=' 
}, 

& используется для передачи методов, в то время как = используется для объектов (это упрощение). Поскольку ваши model и errors являются объектами, вместо этого вы хотите использовать =.

Наконец, в вашем примере ваш шаблон html и шаблон вашей директивы не имеют того же имени ... у вас есть дополнительные 's' в вашем .js, но это, вероятно, только в плункере, а не ваше настоящее приложение.

+0

Спасибо. Я получил эту работу. Можете ли вы подробнее рассказать о '' & 'для методов,' = 'для объектов? Я понимаю, что вы упрощаете, и я использовал их оба раньше, но похоже, что вы лучше понимаете, чем я. – ravinggenius

+0

[Угловые документы] (http://docs.angularjs.org/api/ng.$compile#description_comprehensive-directive-api_directive-definition-object). Короче говоря, поскольку вы сделали изолированную область действия, которая автоматически не наследуется от родителя, вам нужно подключиться вручную. '=' устанавливает двустороннюю привязку между свойствами (обычно это объекты), поэтому, когда один обновляется, другой тоже, и является наиболее распространенным назначением. '&' дает вам ссылку на вызов функции, как если бы вы были родительской областью, и в основном используется, если вы можете использовать несколько контроллеров и должны вызывать другой метод, в зависимости от того, – Hylianpuffball

Смежные вопросы