自定义角度指令中的ng-repeat不起作用

时间:2015-11-04 11:10:08

标签: javascript angularjs directive

我正在尝试使用一些分层数据构建一个非常简单的自定义指令。列表中的每个页面都有子页面,数据格式为:

{"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也不起作用。

2 个答案:

答案 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