我有一个非常简单的指令,没有隔离作用域。 它被用于 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和项发送到指令(作为隔离的作用域变量),然后将逻辑存在于指令中。这将保留指令中的所有指令逻辑,这将使该指令更可重用。