指令不能''require:ngRepeat'
directive can not ''require:ngRepeat'
我在下面编写指令,以便在 ngRepeat
元素在 UI 上呈现时调用一个函数。
指令
directives.directive('repeatDone', function() {
return {
restrict: 'A',
require: 'ngRepeat',
link: function(scope, element, attrs, ngModel) {
if (scope.$last) {
scope.$eval(attrs.repeatDone);
}
}
};
});
但它给出 $compile
错误。
如果我删除 require 部分,它工作正常。
为什么AngularJS不能接受"require: 'ngRepeat'"?
帮助将不胜感激。
您应该 $timeout
在评估范围之前。因为当您在超时内编写代码时,$timeout
将在当前摘要周期完成后 运行。
或者您可以使用 scope.$evalAsync
而不是 scope.$eval
$timeout which implicitly calls $apply() after a delay & $apply runs $digest cycle
call exactly after DOM redered element on browser
$evalAsync maintain async queue, and gets called after digest cycle
call exactly before DOM redered element on browser
代码
directives.directive('repeatDone', function($timeout) {
return {
restrict: 'A',
link: function(scope, element, attrs, ngModel) {
if (scope.$last) {
$timeout(function () {
scope.$eval(attrs.repeatDone);
});
//or you can use
//scope.$evalAsync(attrs.repeatDone);
}
}
};
});
谢谢。
require
用于访问另一个指令的控制器。但是 ng-repeat
没有控制器。看看 source for ng-repeat
, the word controller doesn't even appear in the code. The documentation 也没有提到 ng-repeat
的控制器。
通常,当您使用 require
时,是因为您要调用所需控制器的函数。在指令的 link 函数中,您添加了参数 ngModel
—— 如果控制器存在,它将填充控制器。但是你永远不会在代码中使用这个 ngModel
参数。目前还不清楚为什么在这种情况下你需要使用 require
。
编辑:
进一步检查,您可能正试图要求 ng-repeat
,因为您的 repeat-done
指令在 ng-repeat
的上下文之外不起作用。如果这是原因,另一个解决方案可能是遍历 DOM 查看 repeat-done
指令的父元素,看看它们是否具有属性 'ng-repeat'。如果未找到,您的指令可能会引发错误。但这似乎需要更多关于投资的代码 w/little return...
我在下面编写指令,以便在 ngRepeat
元素在 UI 上呈现时调用一个函数。
指令
directives.directive('repeatDone', function() {
return {
restrict: 'A',
require: 'ngRepeat',
link: function(scope, element, attrs, ngModel) {
if (scope.$last) {
scope.$eval(attrs.repeatDone);
}
}
};
});
但它给出 $compile
错误。
如果我删除 require 部分,它工作正常。
为什么AngularJS不能接受"require: 'ngRepeat'"? 帮助将不胜感激。
您应该 $timeout
在评估范围之前。因为当您在超时内编写代码时,$timeout
将在当前摘要周期完成后 运行。
或者您可以使用 scope.$evalAsync
而不是 scope.$eval
$timeout which implicitly calls $apply() after a delay & $apply runs $digest cycle call exactly after DOM redered element on browser
$evalAsync maintain async queue, and gets called after digest cycle call exactly before DOM redered element on browser
代码
directives.directive('repeatDone', function($timeout) {
return {
restrict: 'A',
link: function(scope, element, attrs, ngModel) {
if (scope.$last) {
$timeout(function () {
scope.$eval(attrs.repeatDone);
});
//or you can use
//scope.$evalAsync(attrs.repeatDone);
}
}
};
});
谢谢。
require
用于访问另一个指令的控制器。但是 ng-repeat
没有控制器。看看 source for ng-repeat
, the word controller doesn't even appear in the code. The documentation 也没有提到 ng-repeat
的控制器。
通常,当您使用 require
时,是因为您要调用所需控制器的函数。在指令的 link 函数中,您添加了参数 ngModel
—— 如果控制器存在,它将填充控制器。但是你永远不会在代码中使用这个 ngModel
参数。目前还不清楚为什么在这种情况下你需要使用 require
。
编辑:
进一步检查,您可能正试图要求 ng-repeat
,因为您的 repeat-done
指令在 ng-repeat
的上下文之外不起作用。如果这是原因,另一个解决方案可能是遍历 DOM 查看 repeat-done
指令的父元素,看看它们是否具有属性 'ng-repeat'。如果未找到,您的指令可能会引发错误。但这似乎需要更多关于投资的代码 w/little return...