1

我想在 angularJS 中创建一个树形网格。我正在创建一个指令来实现这一点。每一行都包含一个元素和层次结构。到目前为止,我创建了一个带有树视图的表。但是子元素没有获得相对范围。

当我创建一个新行时,我正在调用 _newRow(item, level)。我在哪里创建行并返回 . 现在对于这个特定的行,“项目”应该是范围。

完整代码可在http://jsfiddle.net/sravanrekandar/Kzw6q/2/获得

    (function(){
    'use strict';
    angular.module('$srv.directives').directive('bsTree', [
      '$parse',
      '$compile',
      '$timeout',
      function ($parse, $compile, $timeout) {
        var buildTemplate = function (items, ul) {

            var table = [
                    '<table class="table table-bordered">',
                        '<thead><tr><th>Item</th><th>Href</th><th>Level</th></t></thead>',
                    '</table>'
                ],
                level = 1,
                tbody = angular.element('<tbody></tbody'),
                rows;

                table = angular.element(table.join(''));
                rows = _prepareRows(items, level);
                tbody.append(rows)
                table.append(tbody);

            function _newRow(item, level) {            
                var tr = [
                    '<tr>',
                        '<td>',
                            '<span ng-click="toggleCollapse(item)" ng-class="{\'icon-plus-sign\': !item.isCollapsed}" class="tree-level-' + level + '">',
                            '</span>',
                            item.text,
                        '</td>',
                        '<td>' + item.href + '</td>',
                        '<td>' + level + '</td>',
                    '</tr>'
                    ].join('');

                tr = angular.element(tr);
                //$compile(tr)(item); // [[Error: TypeError: Object #<Object> has no method '$watch']]
                return tr;
            }

            function _prepareRows(items, level) {
                var rows = [],
                    i;
                angular.forEach(items, function (item, index) {
                    if(!item.isCollapsed) {
                        item.isCollapsed = true;
                    }
                    var row = _newRow(item, level);
                    rows.push(row);

                    if(item.items && item.items.length) {
                        row = _prepareRows(item.items, level+1);
                        if (angular.isArray(row)) {
                            for(i = 0; i < row.length; i++) {
                                rows.push(row[i]);
                            }
                        }
                    }
                });
                return rows;
            }
            return table;
        };
        return {
          restrict: 'EA',
          scope: true,
          link: function postLink(scope, iElement, iAttrs) {
            var getter = $parse(iAttrs.bsTree), items = getter(scope);
            $timeout(function () {
              if (!angular.isArray(items)) {
              }
              var table = buildTemplate(items);
              table.insertAfter(iElement);
              $compile(iElement.next('table.table'))(scope);
            });
          }
        };
      }
    ]);
})();
4

1 回答 1

0

默认情况下继承范围。您正在使用“范围:true”为您的指令创建一个新范围。尝试从您的指令中删除“范围:true”。然后它应该从您的控制器继承范围。

于 2013-09-02T23:50:26.770 回答