设置阶段 - 这不会发生在单个范围内,我可以在其中绑定一个简单的属性。我想要淡入/淡出的元素不位于控制器内,它位于 ng-app (rootScope) 内。此外,单击的按钮位于距根目录约 3 个子级的子范围内。
这是我目前解决这个问题的方法:
HTML(位于根范围内):
<ul class="nav-secondary actions"
darthFader fadeDuration="200"
fadeEvent="darthFader:secondaryNav">
darthFader 是我的指令。
指示:
指令('darthFader',
function() {
return {
restrict: 'A',
link: function($scope, element, attrs) {
$scope.$on(attrs.fadeevent, function(event,options) {
$(element)["fade" + options.fade || "In"](attrs.fadeduration || 200);
});
}
}
})
所以在这里我创建了一个事件处理程序,特定于给定元素,它调用fadeIn 或fadeOut,这取决于通过事件总线传递的选项(或默认为fadeIn/200ms)。
然后我从 $rootScope 广播一个事件来触发这个事件:
$rootScope.$broadcast('darthFader:secondaryNav', { fade: "Out"});
虽然这可行,但我并不热衷于为该指令的每个实例创建一个事件侦听器(虽然我预计屏幕上不会有太多的 darthFader,但它更适合我要建立的模式)。我也不热衷于将视图中的属性与控制器和指令中的事件处理程序耦合,但我目前没有包装辅助导航的控制器,所以我必须将辅助导航绑定到 $ rootScope,我也不喜欢。所以我的问题:
- 有没有办法在每次实例化我的指令时不创建事件处理程序来做到这一点?(也许是存储有状态元素列表的服务?)
- 我应该如何解耦我的视图、控制器和指令?
- 我还缺少其他任何明显的问题吗?
干杯!