我正在尝试使用一些分层数据构建一个非常简单的自定义指令。列表中的每个页面都有子页面,数据格式为:
{"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
对象的子对象。
此外,当指令的标记仅用于包含来自父作用域的数据的常规页面时,根本没有问题。这似乎是指令本身的一个问题。
修改
这是填充指令数据的页面控制器:
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也不起作用。
答案 0 :(得分:1)
在指令中,您提到了&#34; pageList&#34;。但是在模板中,您使用&#34; PageList&#34;来访问它。所以,我想它可以解决使用问题。
答案 1 :(得分:0)
正如我们在评论中检测到的那样:您的代码工作正常,并且指令的模板存在问题。
在指令中使用replace:true
时,加载的模板必须只有一个根元素,否则会出现下一个错误:
错误:[$ compile:tplrt]指令'pageSelectList'的模板必须只有一个根元素。 PageSelectList.html
https://docs.angularjs.org/error/ $编译/ tplrt P0 = pageSelectList&安培; P1 = PageSelectList.html
所以,为了解决你有两种方法:
1)将模板包装在容器中,如div
<div>
your directive
<p>{{ pageList.Title }}</p><p>{{ pageList.Id }}</p>
</div>
2)删除标记replace
,或使用replace: false
。