在我的解决方案中,我有一些需要首先加载的自定义指令,因为它们包含其兄弟指令调用的函数的定义。例如:
<div id="container">
<custom-directive1></custom-directive1>
<custom-directive2></custom-directive2>
<custom-directive3></custom-directive3>
</div>
不幸的是,这里没有一个解决方案对我有用,因为它们只在渲染指令后才有效,而不是在指令代码后面。
因此,当我实现上述任何解决方案时,为了执行一些加载函数,即使渲染了指令,作用域也不知道这些指令中的函数是什么。
所以我在控制器的任何地方创建了一个 observable:
//Call every time a directive is loaded
$scope.$watch('directiveLoaded', function (value) {
debugger;
if (value == document.querySelector('#container').children.length) {
//Its ok to use childHead as we have only one child scope
$scope.$$childHead.function1_Of_Directive1();
$scope.$$childHead.function1_Of_Directive2();
}
});
然后我有这两个指令,我放置
scope.$parent.directiveLoaded += 1;
在每个指令的底部。因为在控制器中我定义了 observable,所以每次更新变量directiveLoaded
时,它都会执行 observable 函数。是的,我知道这是一个 hack,但要保证所有指令在执行最终函数之前完成渲染及其背后的代码,这是一个很小的代价。
为了完成这里的演示,有两个指令定义了以后需要调用的函数。
指令1
(function () {
app.directive('customDirective1', function () {
return {
restrict: 'E',
templateUrl: '/directive1.html',
link: function (scope) {
scope.function1_Of_Directive1 = function() {
scope.function2_Of_Directive2();
console.log("F1_D1")
}
//AT BOTTOM OF EVERY DIRECTIVE
scope.$parent.directiveLoaded += 1;
}
}
});
})();
指令2
(function () {
app.directive('customDirective2', function () {
return {
restrict: 'E',
templateUrl: '/directive1.html',
link: function (scope) {
scope.function1_Of_Directive2 = function() {
console.log("F1_D2")
}
scope.function2_Of_Directive2 = function() {
console.log("F2_D2")
}
//AT BOTTOM OF EVERY DIRECTIVE
scope.$parent.directiveLoaded += 1;
}
}
});
})();