AngularJS: «Шаблон для директивы должен иметь ровно один корневой элемент» при использовании тега «th» в шаблоне директивы

Я тоже столкнулся с проблемой. Я заметил, что дважды открыл тот же проект.

So QuitXCode> Откройте ваш проект и убедитесь, что открыт только один экземпляр> Очистить> Папка CleanBuild в некоторых случаях> build.

Он должен работать

29
задан Victor 31 March 2015 в 14:00
поделиться

10 ответов

Я ожидаю, что <th> растворяется в некоторой промежуточной точке, когда он оценивается вне контекста <tr> (поместите этот шаблон в какую-то случайную часть вашей веб-страницы, чтобы увидеть, как <th> исчезает).

На вашем месте я бы использовал <div> в шаблоне, изменил бы sort-by-directive на директиву типа «А» и использовал бы <th sort-by-directive>...</th>, как и прежде, без replace: true.

18
ответ дан chbrown 31 March 2015 в 14:00
поделиться

Я встречал такие странности с элементами директивы и таблицы. См. Этот выпуск , например. Попробуйте обернуть ваш шаблон тегом div или используйте replace:false.

32
ответ дан haki 31 March 2015 в 14:00
поделиться

Это не ваш случай, но у меня возникла та же проблема, потому что мой код содержал html комментарии до и после разметки шаблона, например:

<!-- Foo Widget -->
<div class="foo-widget">[...]</div>
<!-- end:: Foo Widget -->

- проблема решена.

22
ответ дан darksoulsong 31 March 2015 в 14:00
поделиться

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

<div>
  <div... </div>
</div>

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

2
ответ дан Giridhar Bandi 31 March 2015 в 14:00
поделиться

Я получил эту ошибку, когда использовал свойство template определения директивы, когда мне следовало использовать templateUrl, если это кому-нибудь поможет.

6
ответ дан racl101 31 March 2015 в 14:00
поделиться

Я сталкиваюсь со следующей ошибкой:

Error: [$compile:tplrt] http://errors.angularjs.org/1.2.6/$compile/tplrt?p0=stockWidget&p1=stock.html.

Я обхожу, удаляя комментарий в самом верху файла шаблона.

замена устарела с angularjs 1.3 вперёд, следующий релиз удалит её полностью, лучше не использовать клавишу замены.

1
ответ дан Baby Groot 31 March 2015 в 14:00
поделиться

Как утверждают другие: это потому, что ваш браузер игнорирует TH, прежде чем он будет помещен в таблицу. Мой предпочтительный способ исправить это - изменить директиву на директиву атрибута и добавить ее в TH в таблице.

Директива выглядит следующим образом:

.directive('sortByDirective', function () {

    return {
        templateUrl: 'SortHeaderTemplate',
        restrict: 'A',
        transclude: true,
        replace: false,
        scope: {
            sortdir: '=',
            sortedby: '=',
            sortvalue: '@',
            onsort: '='
        },
        link: function (scope, element, attrs) {
            scope.sort = function () {
                if (scope.sortedby == scope.sortvalue)
                    scope.sortdir = scope.sortdir == 'asc' ? 'desc' : 'asc';
                else {
                    scope.sortedby = scope.sortvalue;
                    scope.sortdir = 'asc';
                }
                scope.onsort(scope.sortedby, scope.sortdir);
            }
        }
    };
});

Установка ее на странице выглядит следующим образом:

<th sort-by-directive
  ng-repeat="header in headers"
  onsort="onSort"
  sortdir="filterCriteria.sortDir"
  sortedby="filterCriteria.sortedBy"
  sortvalue="{{ header.value }}">{{ header.title }}
</th>
2
ответ дан Tim 31 March 2015 в 14:00
поделиться

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

оказывается, по какой-то странной причине, что эта ошибка возникает и в случае, если в 'templateUrl' есть опечатка - если angular не может найти html-файл по заданному пути - вы получите то же самое ' ошибка только одного корневого элемента.

так - исправление templateUrl исправило ошибку для меня.

надеюсь, что это поможет кому-нибудь в будущем.

3
ответ дан Ariel Nahom 31 March 2015 в 14:00
поделиться

Эта ошибка также может быть вызвана тем фактом, что вам нужно иметь элемент обертки для всех ваших тегов в шаблоне директивы. Шаблон вашей директивы не может быть только:

<nav></nav>
<div></div>

Он должен быть:

<div>
 <nav></nav>
 <div></div>
</div>
9
ответ дан eloone 31 March 2015 в 14:00
поделиться

Какую версию angular вы используете?

Была ошибка для чего-то похожего на вашу проблему, которая была исправлена ​​в 1.2.13 1.3 Beta 1 commit link

https://github.com/angular/angular.js/issues/1459

0
ответ дан CCH 31 March 2015 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: