AngularJS : 未调用指令函数

AngularJS : directive function not called

我提供的用于定义指令的函数从未被调用。以前用的好好的,突然就不行了,不知道为什么。

这是我的指令:

portalApp.directive('contactPanel', function () {
    console.log("NEVER SHOWN!");
    return {
        restrict: 'AE',
        replace: 'true',
        templateUrl: 'partials/account/contactPanel.html',
        scope: {
            contact: '=contact',
            primaryRoleName: '@',
            roleName: '@',
            primary: '=primary',
            locations: '=locations'
        },
        controller: function (userService, $rootScope, $scope) {
            ...snip...
        }
    };
});

这是一个使用示例:

<contact-panel contact="user.account.contacts.billing" role-name="billing"
               locations="locations"></contact-panel>

请注意,我使用了正确的大小写,即 JS 中的驼峰式大小写和 HTML 中的连字符。

关键线索是记录在第二行(即 'NEVER SHOWN!')的消息从未出现在控制台中。如果我在指令声明之前立即记录一条消息,那么它就会显示出来,所以解释器正在执行这段代码,但框架从未使用我的声明。

显然我很想得到答案,但我也很想听听一些调试此类问题的方法。

我只能看到 2 种可能会表现出您所描述的行为。带有指令的 HTML 未编译或未注册指令。

"not compiled" 案例 可能是因为该指令在 Angular 应用程序之外使用,例如:

<div ng-app="portalApp">
 ...
</div>
...
<contact-panel></contact-panel>

或者,如果您动态添加了 HTML,但没有添加 $compile 和 link。

"not registered" 案例 可能是由于重新注册了应用的模块。换句话说,您可能遇到以下情况:

var portalApp = angular.module("portalApp", []);
portalApp.directive("contactPanel", function(){...});

// then elsewhere you use a setter:

angular.module("portalApp", []).controller("FooCtrl", function(){});    
// instead of the getter:
// var app = angular.module("portalApp");

第二次调用 angular.module("portalApp", []) 删除了之前注册的 .directive("contactPanel", ...

我找出了这个问题的原因。在某些时候,我一定是不小心将指令移到了这样的配置块中:

portalApp.config(function ($stateProvider, $urlRouterProvider) {
    portalApp.directive('contactPanel', function () {
        console.log("NEVER SHOWN!");
        return {
            ...snip...
        };
    });
});

一旦我将其移出配置块并移入全局范围,指令立即按应有的方式呈现。

这不起作用的原因是 angular 运行 是 运行 指令之后的配置代码,如下所示:

runInvokeQueue(moduleFn._invokeQueue);    // runs directives
runInvokeQueue(moduleFn._configBlocks);   // runs config blocks

所以从配置块中添加到 _invokeQueue(directive() 函数所做的)的东西将永远不会被执行。

感谢所有试图提供帮助的人。