当与 ng-repeat 一起使用时,我应该如何在指令中$eval属性



我有一个非常简单的指令,没有隔离作用域。 它被用于 ng 重复元素,我想限制它适用于该 ng-repeat 的哪个元素。 它不适用于ng-repeat创建的每个元素。 所以我有一个属性可以计算范围内的角度表达式,但它似乎不起作用。 我有一种感觉,这是因为ng-repeat创建了自己的范围,但我认为我无法访问它。 这是指令代码:

App.directive('testDriveStep', ['$log', function($log) {
  return {
    link: function( $scope, element, attribs ) {
        // this is the line that has trouble.
        var enabled = attribs.testDriveEnabled ? $scope.$eval(attribs.testDriveEnabled) : true;
        if( enabled ) {
           // enable the directive otherwise do nothing
        }
    }
  };
}]);

这是我尝试执行的代码:

<li ng-repeat="item in items" test-drive-step test-drive-enabled="$index == 0 && item.band == 'band1'"/>

如果我删除启用属性中布尔表达式的第二部分(即 lesson.band == 'band1')。 它的工作原理是评估正确评估。 但是,当我添加项目的使用时,似乎项目是未定义的,这让我认为指令的范围与 ng-repeat 不同。 我需要做什么来解决这个问题?

需要使指令成为隔离范围,并在该定义的范围内启用体验版:

return {
    scope: {
      testDriveEnabled: '='
    },
    link: function(scope, element, attr) {
      // access expression with scope.testDriveEnabled
    }

它不能是共享范围,因为该指令应用于每个 ng-repeat 元素。由于您希望一次拥有多个实例,因此需要独立范围。

另外,考虑传递一个函数而不是一个表达式——比如

<li ng-repeat="item in items" test-drive-enabled="isTestDriveEnabled($index, item)"></li>

在控制器中,定义:

scope.isTestDriveEnabled = function(idx, item) {
  return (idx === 0 || item.band === 'band1');
}

您也可以只将$index和项发送到指令(作为隔离的作用域变量),然后将逻辑存在于指令中。这将保留指令中的所有指令逻辑,这将使该指令更可重用。

最新更新