Шаблон для директивы должен иметь ровно один корневой элемент

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

Когда я использую свою директиву в html, я становлюсь ниже ошибки:

Error: [$compile:tplrt] Template for directive 'cwClearableInput' must have exactly one root element. 

HTML:

<div class="input-group">
         <cw-clearable-input ng-model="attributeName"></cw-clearable-input>
 </div>

clearable_input.js:

angular.module('cw-ui').directive('cwClearableInput', function() {
  return {
    restrict: 'EAC',
    require: 'ngModel',
    transclude: true,
    replace: true,
    template: '<input type="text" class="form-control"/><span class="input-group-btn"><button type="button" class="btn" ng-click="" title="Edit"><span class="glyphicon-pencil"></span></button></span>',
    controller: function( $scope ) {

    }
};
});

Я не могу понять, как этого добиться.

Ответы

Ответ 1

Ну, ошибка довольно понятна. У вашего шаблона должен быть один корень, а у вас два. Самый простой способ разрешить это - просто обернуть все это в div или span:

template: '<div><input type="text" class="form-control"/><span class="input-group-btn"><button type="button" class="btn" ng-click="" title="Edit"><span class="glyphicon-pencil"></span></button></span></div>',

До:

<input type="text" class="form-control"/>
<span class="input-group-btn">
  <button type="button" class="btn" ng-click="" title="Edit">
    <span class="glyphicon-pencil"></span>
  </button>
</span>

После:

<div>    <!--  <- one root   -->
  <input type="text" class="form-control"/>
  <span class="input-group-btn">
    <button type="button" class="btn" ng-click="" title="Edit">
      <span class="glyphicon-pencil"></span>
    </button>
  </span>
</div>

Ответ 2

Эта ошибка также возникает, если путь к шаблону неверен, и в этом случае ошибка - это все, кроме пояснения.

Я ссылался на шаблон изнутри templates/my-parent-template.html с (неправильным)

шаблонов URL = "подпапка/мой-ребенок-template.html"

Я изменил это на

шаблонах URL = " Шаблоны/subfolder/my-child-template.html"

который решил его.

Ответ 3

Просто оберните свой шаблон:

template: '<div><input type="text" class="form-control"/><span class="input-group-btn"><button type="button" class="btn" ng-click="" title="Edit"><span class="glyphicon-pencil"></span></button></span></div>',

Ответ 4

Если вы не хотите создавать один корневой элемент, вместо него вы можете заменить replace на false. В вашей директиве вы устанавливаете значение true, которое заменяет тег директивы "cw-clearable-input" корневым элементом вашей директивы.

Ответ 5

Если у вас есть комментарий в вашем шаблоне рядом с корневым элементом в шаблоне директивы, вы увидите ту же ошибку.

Например. Если в вашем шаблоне директивы есть такой HTML-код (в директиве JS для "replace" установлено значение true), вы увидите ту же ошибку

<!-- Some Comment -->
<div>
   <p>Hello</p>
</div>

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

<div>
   <!-- Some Comment -->
   <p>Hello</p>
</div>

Ответ 6

Когда это не помогло мне, префикс / к пути шаблона исправил проблему в моем случае.

function bsLoginModal() {
        return {
            restrict: 'A',
            templateUrl:'/app/directives/bootstrap-login-modal/template.html',
            link: linkFunction,
            controller: SignInCtrl,
            controllerAs: 'vm'
        }
    }

вместо

templateUrl:'app/directives/bootstrap-login-modal/template.html

Удачи.

Ответ 7

Проверьте шаблон или templateUrl

templateUrl: 'some/url/here.html'

template: '<div>HTML directly goes here</div>'

Ответ 8

Моя проблема заключалась в том, что веб-пакет HtmlWebpackPlugin добавлял тег скрипта к содержимому директивы. Так что угловатый было видно:

<div>stuff</div>
<script type="text/javascript" src="directives/my-directive"></script>

Решение состоит в том, чтобы использовать опцию HtmlWebpackPlugin inject в вашем webpack.config.js:

new HtmlWebpackPlugin({
  template: './src/my-directive.html',
  filename: './src/my-directive.html',
  inject: false
}),