将ngRepeat包装在另一个指令中

时间:2014-01-26 17:43:40

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

我正在尝试编写一个paginator作为我的应用程序的指令,但我似乎无法让它工作。我看过的每个地方都建议使用$compile,但我根本无法使用它。

这就是我所拥有的,您可以观看现场演示here

var app = angular.module('myApp', []);

app.controller('MyController', function($scope) {
  $scope.items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
});

app.directive('myPaginator', function() {
  return {
    restrict : 'A',
    priority : 1000,

    scope : {
      items : '=myPaginator'
    },

    controller : function($scope) {
      $scope.amount = 5;
    }
  };
});

app.directive('myPaginatorItem', function($compile) {
  return {
    restrict : 'A',
    require  : '^myPaginator',
    priority : 999,

    compile : function(element) {
      element
        .removeAttr('my-paginator-item')
        .attr('ng-repeat', 'item in items | limitTo:amount');

      return function($scope, element) {
        $compile(element)($scope);
      }
    }
  };
});

你可能会说,我对角度很新,任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

我设法通过将数据存储在主指令的控制器而不是范围上来使其工作,您可以看到here

var app = angular.module('myApp', []);

app.controller('MyController', function($scope) {
  $scope.items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
});

app.directive('myPaginator', function() {
  return {
    restrict : 'A',
    priority : 1000,
    replace  : true,

    scope : {
      items : '=myPaginator'
    },

    controller : function($scope) {
      this.items = $scope.items;
      this.amount = 5;
    }
  };
});

app.directive('myPaginatorItem', function($compile) {
  return {
    restrict : 'A',
    require  : '^myPaginator',
    priority : 999,
    scope    : {},

    compile : function(element) {


      element
        .removeAttr('my-paginator-item')
        .attr('ng-repeat', 'item in paginator.items | limitTo:paginator.amount');

      return function($scope, element, $attrs, paginator) {
        $scope.paginator = paginator;
        $compile(element)($scope);
      }
    }
  };
});

答案 1 :(得分:0)

这里有两个主要问题:

首先,您的指令不共享相同的范围:

enter image description here

其次,在您指示内部,您引用外部范围变量items

.attr('ng-repeat', 'item in items | limitTo:amount');