2014-07-04 2 views
2

Я использую этот пользовательский шаблон внутри директивы для создания настраиваемых полей ввода с ассоциированными этикетками:Ярлык не работает в angularjs директиве

template: function(elem, attrs) { 
     var elemTpl = '<div> ' + 
          '<div class="form-group col-md-{{cols}}" >' + 
           '<label for="{{id}}" class="control-label input-sm">{{text}}</label> ' + 
           '<input type="{{type}}" ng-model="value" name="' + attrs.id + '" id="' + attrs.id + 
           '" class="form-control input-sm szpFocusable" placeholder="{{placeholder}}" ng-required="required" spellcheck="false"/>' + 
          '</div> ' + 
         '</div>'; 

     return elemTpl; 
    } 

Проблема в том, что, когда метка будет нажата, то поле ввода не сфокусированы. Когда вы перемещаете код вне директивы и помещаете теги ввода непосредственно в html, все работает нормально. Идентификатор и атрибуты имени привязаны правильно к соответствующим полям области.

+0

вы уверены, что {{ID}} такая же, как attrs.id? проверьте сгенерированный html с firebug (или другим инструментом разработчика) – Michiel

+0

100% уверен. Проверял его с помощью инструмента для обработки хрома. – zszep

+0

Любой шанс, что идентификатор не уникален? – Michiel

ответ

4

Вы уверены, что идентификатор, который вы используете, уникален?

Другой вариант заключается в гнезде <input> тег в <label>, в этом случае вам не нужно for аргумент:

var elemTpl = '<div> ' + 
     '<div class="form-group col-md-{{cols}}" >' + 
     '<label class="control-label input-sm">{{text}}' + 
      '<input type="{{type}}" ng-model="value" name="' + attrs.id + '" id="' + attrs.id + '" class="form-control input-sm szpFocusable" placeholder="{{placeholder}}" ng-required="required" spellcheck="false"/>' + 
     '</label>' + 
     '</div> ' + 
     '</div>'; 

Примечание: Реальный ответ на 2-й комментарий ниже: В директиве содержимое шаблона элемента помещается в тег директивы, в этом случае приводя к тому, что идентификатор используется дважды. Это можно решить, добавив replace : true к возвращаемому значению директивы. Это заменит ваш тег директивы содержимым вашего шаблона.

app.directive('myDirective', function() { 
    return { 
     replace: 'true', 
     template: templateThatUsesId 
    }; 
}); 
+0

Одна смешная вещь, о которой я уже говорил, заключается в том, что при замене в true в директиве заменяется верным тегом директивы, но все атрибуты переносятся в следующий html-тег, «div» в моем случае. Любая идея, почему это так? – zszep

+2

Ничего, прочитайте документацию сейчас, она говорит: замените текущий элемент содержимым HTML. Процесс замещения переносит все атрибуты/классы из старого элемента в новый. Дополнительную информацию см. В разделе «Создание компонентов» ниже. – zszep

+0

@zszep, Спасибо за последний комментарий, я, наконец, понимаю теперь :-) Определенно полезно! – Michiel

1

Ярлык работает на идентификатор, а не для имени

<label for="idxyz" class="control-label input-sm">{{text}}</label> 
<input id="idxyz" type="{{type}}" ng-model="value" ..... 

Это всегда работает для меня!

+0

Как я сказал в своем комментарии, идентификатор и имя совпадают. Проблема заключалась в том, что метка и элемент ввода были в директиве и в том, как действуют директивы: «замените текущий элемент содержимым HTML. Процесс замещения переносит все атрибуты/классы из старого элемента в новый " – zszep

+0

name =" '+ attrs.id +' "id =" '+ attrs.id +' ", поэтому в вашем случае используйте ту же логику, что и для =" + attrs.id + ", и 100% уверены, что это будет работать. –

1

Здесь есть более точный ответ: Attribute of label not working in angular directive?

При рендеринге директивы с шаблонами контейнер имеет тот же идентификатор, чем флажок:

<div class="color-warning checkbox ng-isolate-scope ng-valid" ng-model="ckeck4" id="kitten> 
<input id="kitten" type="checkbox"> 
<label for="kitten">CUSTOM LABEL</label> 
</div> 

ДИВ что упаковщики обработанную директивы и флажок имеют одинаковый идентификатор, не совсем хорошо.

Для того, чтобы удалить его, мы используем функцию ссылки:

link: function(scope,el,attrs){ 
    el.removeAttr("id") 
} 

Это происходит потому, что функция ссылки выполняется перед Угловые делает директиву, поэтому мы removin идентификатора из DIV, что упаковщики директивы , здесь мой полный код:

(function() { 
    'use strict'; 
    angular.module('planetCheckbox', []) 
    .controller('PlanetCheckboxController', PlanetCheckboxController) 
    .directive('checkbox', DirectiveCheckbox); 

    function DirectiveCheckbox() { 
     return { 
      restrict: 'E', 
      replace: true, 
      scope: { 
       ngModel: '=', 
       classes: '@class', 
       customLabel: '@', 
       check: '=', 
       id:'@'//, 
       //radio :'@' 
      }, 
      link: function(scope,el,attrs){ 
       el.removeAttr("id") 
      }, 
      controller: 'PlanetCheckboxController', 
      templateUrl: 'planet-checkbox/template.html' 
     } 
    }; 

    PlanetCheckboxController.$inject = ['$scope']; 
    function PlanetCheckboxController($scope) { 
     $scope.ngModel = $scope.check; 
    }; 

    angular.module('planetCheckbox') 
     .run(['$templateCache', function ($templateCache) { 
     $templateCache.put('planet-checkbox/template.html', '<div class="checkbox">'+ 

      '<input id="{{id}}" type="checkbox" />' + 
      '<label for="{{id}}">CUSTOM LABEL</label>' + 
     '</div>' 



     ); 
    }]); 
})(); 

живой пример здесь: http://jsfiddle.net/cherniv/5u4Xp/

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