Проблема заключается в том, что Angular изначально заменяет ngIf
комментатором, который используется для отслеживания места размещения условного кода. Это проще всего увидеть на примере.
Ваш HTML:
<div control-group>
<label>Test</label>
<input type="text" ng-model="editing.name" />
<span class="text-error" ng-if="editing.name.length != 3"> Name must be 3 characters </span>
</div>
Похоже, это внутри вашей transclude функция в cloned
переменной (transclude(function (cloned) {
):
<div control-group>
<label>Test</label>
<input type="text" ng-model="editing.name" class="ng-valid ng-dirty">
<!-- ngIf: editing.name.length != 3 -->
</div>
Итак, элемент с классом text-error
, что вы фильтрации на (ниже) не находится в cloned
. Просто комментарий есть.
var inputsAndMessages = cloned.filter('input, button, select, .text-error');
Поскольку вы только transcluding элементов, которые соответствуют выше ФИЛЬТРУ ngIf
комментария теряются.
Решение является фильтрация для комментариев, а также и добавить их в Append (так Угловая поддерживает это точка отсчета в ngIf
). Один из способов сделать это, чтобы заменить выше этого (используя тот факт, что HTML комментарий тип узла 8)
var messages = cloned.filter(function(){ return this.nodeType == 8; }); //comments
var inputs = cloned.filter('input, button, select')
var inputsAndMessages = inputs.add(messages);
Working plunker
Хорошо, это работает - вы объяснили, что происходит.Я думаю, в реальном коде, так как я не знаю, будет ли 'ng-if' на подэлементе или нет, мне нужно установить определение директивы' terminal: true' и сам 'comp compile' , Таким образом, я могу переделать элементы перед компиляцией 'ng-if' get и превратить в комментарий. –