AngularJS:未调用指令函数

时间:2015-09-15 02:05:34

标签: javascript angularjs angularjs-directive directive

我提供的用于定义我的指令的函数永远不会被调用。它过去工作正常但突然停止工作,我不明白为什么。

这是我的指示:

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中的camel-case和HTML中的连字符。

关键线索是第二行中记录的消息(即“从不显示!”)从未显示在控制台中。如果我在指令声明之前立即记录消息然后显示,那么解释器正在执行此代码,但框架永远不会使用我的声明。

我很想得到一个明显的答案,但我也很想听到一些方法来调试这类问题。

2 个答案:

答案 0 :(得分:8)

我只能看到两种可能表现出你描述的行为的可能性。带有指令的HTML未编译或指令未注册。

&#34;未编译&#34; case 可能是因为该指令在Angular应用程序之外使用,例如:

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

或者,如果您动态添加了HTML,但没有$compile并将其链接。

&#34;未注册&#34;案件可能是因为重新注册了应用程序的模块。换句话说,您可能会遇到以下情况:

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", ...的注册。

答案 1 :(得分:1)

我找出了这个问题的原因。在某些时候,我必须意外地将指令移动到这样的配置块中:

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(其中的command()函数所做的事情)将永远不会被执行。

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