代码之家  ›  专栏  ›  技术社区  ›  HansA

AngularJS:未调用指令函数

  •  4
  • HansA  · 技术社区  · 9 年前

    我提供的用于定义指令的函数从未被调用。它以前工作得很好,但突然停止工作,我不知道为什么。

    这是我的指示:

    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中的连字符。

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

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

    2 回复  |  直到 9 年前
        1
  •  8
  •   New Dev    9 年前

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

    这个 “未编译”案例 可能是因为该指令在Angular应用程序之外使用,例如:

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

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

    这个 “未注册”案例 可能是因为重新注册了应用程序的模块。换句话说,您可能会遇到以下情况:

    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", ... .

        2
  •  1
  •   HansA    9 年前

    我弄清楚了这个问题的原因。在某个时刻,我一定意外地将指令移动到了如下配置块中:

    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()函数执行)的东西永远不会被执行。

    感谢所有试图帮助的人。