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