Я пытаюсь создать то, что должно быть очень простой пользовательской директивой, используя некоторые иерархические данные. Каждая страница в списке имеет подстраницы, и данные имеют форму:
{"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 в оригинальном примере тоже не работает.
Как мы заметили в комментарии: ваш код работает нормально, а проблема с шаблоном для директивы.
Когда вы используете 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
.
В директиве вы упомянули как "pageList". Но в шаблоне вы обращаетесь к нему с помощью "PageList". Итак, я думаю, что он может решить проблему.