如何让ng-repeat在指令模板中工作

时间:2015-03-02 20:31:03

标签: javascript angularjs angularjs-nvd3-directives

问题:编译语法{{vm.names}}吐出变量,因此我知道视图可以访问它。但是,在ng-repeat之类的指令中使用vm.names没有任何效果。我做了一个console.log(typoeof()),它说“对象”所以我知道它不是一个字符串。

代码:

 function nameDirective (){
    return {
      template: [
        '{{vm.names}}',
        '<tr ng-repeat"name in vm.names">',
          '<td>{{name.id}}</td>',
          '<td>{{name.fName}}</td>',
          '<td>{{name.lName}}</td>',
        '</tr>'
      ].join(''),
      "scope":{
        names:"="
      },
      "controller": nameDirectiveCtrl,
      "controllerAs": 'vm'
    };
  }

  function  nameDirectiveCtrl($scope) {
    var vm = this;

    vm.names = $scope.names;
  }

演示http://plnkr.co/edit/6vlqXFshSxPe5b3Wu7mf?p=preview

1 个答案:

答案 0 :(得分:3)

首先请注意,=中缺少ng-repeat"name in vm.names"。但这不是真正的问题。

另一个问题是,如果您使用restrict: 'E',则需要添加<name-directive names="vm.names"></name-directive>。但这也不会呈现任何东西。

之后我意识到你还需要replace: true。在这种情况下,ngRepeat将起作用,但奇怪的......行将出现在表格之外!

http://plnkr.co/edit/y8Wr2j1mLc3UFvFKo7IB?p=preview

嗯..所以这是解决方案。

这种情况很少见,您应该将指令限制在评论中。您当前方法的问题是<name-directive>元素不能是tbody的直接子元素,因此浏览器修复了无效标记,将元素指令移到外面的其他位置。

下面是带有注释语法的固定指令代码:

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>First Name</th>
            <th>Last Name</th>
        </tr>
    </thead>
    <tbody>
        <!-- directive: name-directive vm.names -->
    </tbody>
</table>

指令看起来像:

function nameDirective() {
    return {
        restrict: 'M',
        template: [
            '<tr ng-repeat="name in vm.names">',
                '<td>{{name.ID}}</td>',
                '<td>{{name.fName}}</td>',
                '<td>{{name.lName}}</td>',
            '</tr>'
        ].join(''),
        scope: {
            names: "=nameDirective"
        },
        replace: true,
        controller: nameDirectiveCtrl,
        controllerAs: 'vm'
    };
}

演示: http://plnkr.co/edit/qTII5HdZP1gXKKZjOXTu?p=preview