Angular Directive表行问题

时间:2013-09-01 14:15:58

标签: javascript angularjs angularjs-directive angularjs-ng-repeat

我是一名初学Angular程序员,但我非常接近理解这些指令。

我创建了一个fiddle here,但我之前从未使用过小提琴,而且它的渲染效果不是很好......

tr-row是一个指令。我试图遍历数据,并打印每个记录的指令(行)。 HTML:

<table ng-controller="fiddleCtrl">
   <thead>
      <th>id</th>
      <th>name</th>
      <th>description</th>
  </thead>
  <tbody>
    <tr><tr-row ng-repeat="d in data" scdata="d"></tr-row></tr>
  </tbody>
</table>

的javascript:

var myapp = angular.module('myApp', [])
.controller('fiddleCtrl', ['$scope', function ($scope) {

$scope.data = [
     { id: 1, name: 'Fred',   description: 'not the best worker' }, 
     { id: 2, name: 'Wilma',  description: 'Freds Wife'}, 
     { id: 3, name: 'Barney', description: 'Freds best friend'}, 
     { id: 4, name: 'Louise', description: 'Never heard of Fred'}, 
     { id: 5, name: 'Tracy',  description: 'Some Chick'}, 
     { id: 6, name: 'Foo',    description: 'Inventer of bar'}
];
}]).directive('trRow', function ($compile) {
return {
    restrict: "E",
    replace: true,
    link: function (scope, element, attrs) {
        scope.id = scope.d.id;
        scope.name = scope.d.name;
        scope.desc = scope.d.description;

        var tmpl = '<tr  ><td>{{id}}</td><td><strong>{{name}}</strong></td><td>{{desc}}</td></tr>';
        element.html(tmpl).show();
        //var e =$compile(tmpl)(scope);
        //element.replaceWith(e);
        var e = $compile(element.contents())(scope);
    },
    scope: {
        d: "="
    }
};
});

应该很容易。 (le叹)

任何帮助都会受到赞赏,我真的需要理解这一点。

我的代码中发生的事情是tr-row指令替换了表。我得到了他们的清单, (使用tr-row元素的tr INSIDE但是没有表格可以显示它们。我知道这意味着我很接近,但我想不出任何新的组合可以尝试。

我只需要一个包含行的简单表格。

我道歉,如果这被问了一百万次,我似乎不确定要搜索什么。我尝试了很多东西。

2 个答案:

答案 0 :(得分:38)

首先,标签名称不能包含dash char。因此,您不能将tr-row用作标记名称,但可以将其用作属性。

然后,你可以简单地写一个这样的指令:

.directive('trRow', function () {

    return {
        template: '<tr><td ng-bind="row.id"></td><td><strong ng-bind="row.name"></strong></td><td ng-bind="row.description"></td></tr>'
    };
});

用法就是这样:

<tbody>
    <tr tr-row ng-repeat="row in data"></tr>
</tbody>

小提琴中的一个工作示例:http://jsfiddle.net/T7k83/85/

答案 1 :(得分:14)

实际上,此问题仅适用于<table>元素。

浏览器解析引擎不喜欢<table>中的无效标记,所以他们会在你的指令有机会替换之前尝试将你的指令从表中抛出(你可以通过检查元素看到它)有效元素。即使您的指令名称中不包含短划线,这也适用。

解决这个问题的方法是使用指令类型A而不是类型E,这是由@MuratCorlu建议的。

对于<div>等其他元素,您几乎可以使用名称中包含破折号的自定义标记替换它。例如,ng-repeat可用作标记。