ng-repeat внутри Custom Angular Directive не работает

0

Я пытаюсь создать то, что должно быть очень простой пользовательской директивой, используя некоторые иерархические данные. Каждая страница в списке имеет подстраницы, и данные имеют форму:

{"Title 1": "Page Title", "Id": "1", "Pages": {"Title 1.1": "Page Title 1.1", "Id": "2"}, {"Title 1.2": "Page Title 1.2", "Id": "3"}}

и так далее. Данные здесь - просто краткая иллюстрация - нет проблемы с методом данных или извлечения.

У меня есть директивный контроллер, настроенный как:

app.directive('pageSelectList', function () {
return {
    restrict: 'EA',
    replace: true,
    scope: {
        pageList: '='
    },
    templateUrl: '/Scripts/App/Directives/Templates/PageSelectList.html',
    link: function (scope, elem, attrs) { }
   };
});

Шаблон:

<ul class="page-list page-root">
    <li ng-repeat="p in pageList.Pages">{{ p.Title }}</li>
</ul>

Директива используется с данными, полученными из родительской области ($scope.listOfPages).

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

<p>{{ pageList.Title }}</p>

Отображается ожидаемая разметка <p>Title 1</p>.

Похоже, что директива имеет какую-то проблему с ng-repeat или что данные, используемые в повторе, являются подобъектом pageList объекта pageList.

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

РЕДАКТИРОВАТЬ

Это контроллер страницы, который заполняет данные для директивы:

var pageEditController = function ($scope, $rootScope, $state, $stateParams, pageService) {
$scope.page = {};
$scope.errorMessage = "";

getPage(); // This is for other data on the page and not directly linked to directive issue.

getPages(); // This is to get the directive data

function getPage() { // Just an http get method for $scope.page }}

function getPages() {
    pageService.getTree()
        .success(function (result) {
            $scope.pageList = result.Result; // This is where the directive data is loaded into scope
        })
        .error(function (error) {
            $scope.errorMessage = 'Unable to load pages';
        });
     };

});

Дальнейшее странное поведение:

Шаблон с этим:

<p>{{ pageList.Title }}</p>

показывает название ОК.

Эта:

<p>{{ pageList.Title }}</p><p>{{ pageList.Id }}</p>

ничего не показывает. Очевидно, что ng-repeat в оригинальном примере тоже не работает.

  • 2
    Не могли бы вы предоставить код, который вы на самом деле используете?
  • 1
    Как вы называете директиву pageSelectList?
Показать ещё 9 комментариев
Теги:
directive

2 ответа

0
Лучший ответ

Как мы заметили в комментарии: ваш код работает нормально, а проблема с шаблоном для директивы.

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

Ошибка: [$ compile: tplrt] Шаблон для директивы 'pageSelectList' должен иметь ровно один корневой элемент. PageSelectList.html
https://docs.angularjs.org/error/ $ compile/tplrt? p0 = pageSelectList & p1 = PageSelectList.html

Итак, для решения вы имеете два пути:

1) оберните свой шаблон в контейнер, как div

<div>
    your directive 
    <p>{{ pageList.Title }}</p><p>{{ pageList.Id }}</p>
</div>

2) снимите флаг replace, или использовать его replace: false.

1

В директиве вы упомянули как "pageList". Но в шаблоне вы обращаетесь к нему с помощью "PageList". Итак, я думаю, что он может решить проблему.

  • 0
    Просто опечатка - обновили ОП

Ещё вопросы

Сообщество Overcoder
Наверх
Меню