指令不能''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...