假设我们有一些嵌套指令:
<big-poppa>
<baby-bird></baby-bird>
</big-poppa>
假设他big-poppa
想要创建一个所有子指令都可以共享的组件。放在控制器里就好了,但是这个组件需要DOM,所以需要在链接函数中构建。
然后假设baby-bird
组件要从组件中读取。也许它想监听它的事件,也许向它发送一两个命令。挑战在于控制器触发 dom(第一个父项,然后是子项),而 post-link 方法触发另一个方向,因此执行顺序如下所示:
- bigPoppa 控制器
- babyBird 控制器
- babyBird 链接
- bigPoppa 链接
父母的方法在孩子的方法之后触发的事实是link
我面临指令内交流挑战的原因。我希望父级构建共享 DOM 组件,但 DOM 构建应该发生在链接函数中。因此,父级在任何子级之后构建组件
我可以通过超时(粗略)或承诺(复杂/非惯用?)来解决这个问题。这是小提琴:
var app = angular.module('app',[]);
app.directive('bigPoppa', function($q){
return {
restrict: 'E',
controller: function($scope){
console.log('bigPoppa controller');
var d = $q.defer()
$scope.bigPoppaLinkDeferred = d
$scope.bigPoppaLink = d.promise
},
link: function(scope, el, attrs){
console.log('bigPoppa link');
scope.componentThatNeedsDom = { el: el, title: 'Something' };
scope.bigPoppaLinkDeferred.resolve()
}
}
});
app.directive('babyBird', function(){
return {
restrict: 'E',
controller: function(){ console.log('babyBird controller'); },
link: function(scope, el, attrs, bigPoppaController){
console.log('babyBird link');
// console.log('poppa DOM component', scope.componentThatNeedsDom); // Not yet defined, because the parent's link function runs after the child's
// setTimeout(function(){ console.log('poppa DOM component', scope.componentThatNeedsDom); }, 1); // Works, but gross
scope.bigPoppaLink.then(function(){
console.log('poppa DOM component', scope.componentThatNeedsDom);
}); // works, but so complex!
}
}
});
console.log(''); // blank line
这里有很多背景,但我的问题很简单:
在父指令运行其链接后功能后,是否有一种干净的方法可以在子指令中执行行为?
也许是一种使用方式priority
,或者pre
andpost
链接方法?