我提供的用于定义我的指令的函数永远不会被调用。它过去工作正常但突然停止工作,我不明白为什么。
这是我的指示:
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中的连字符。
关键线索是第二行中记录的消息(即“从不显示!”)从未显示在控制台中。如果我在指令声明之前立即记录消息然后显示,那么解释器正在执行此代码,但框架永远不会使用我的声明。
我很想得到一个明显的答案,但我也很想听到一些方法来调试这类问题。
答案 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()函数所做的事情)将永远不会被执行。
感谢所有试图提供帮助的人。