我正在使用带有 ui-bootstrap 1.0.4 的 AngularJS 1.0.7。
我的应用程序有一个主导航栏,一些页面有一个额外级别的选项卡(使用 ui.bootstrap 选项卡集和选项卡指令)。
我想要完成的是:
单击选项卡将更新 URL,添加“?tab=name”查询参数。开发人员将为每个<tab>
元素添加一个附加指令以标识名称。
加载视图时,某些东西(这就是问题)将侦听事件(哪个事件?)并更新选项卡,调用select()
选项卡范围内的函数。
我一直在为此苦苦挣扎。基本上,操作顺序是我的方式;$routeChangeSuccess 事件接近我想要的,但是 ngView 指令使用它来加载内容。这意味着监听 $routeChangeSuccess 的指令直到事件被广播后才存在。
查看源代码,我可以看到有一个 $viewContentLoaded 事件。然而,这个时机也很奇怪。
这是我所拥有的:
module = angular.module "navigation-support", ["ui.bootstrap.tabs"]
module.directive "tabBookmark", ($log, $location, $route, $rootScope, $routeParams) ->
restrict: "A"
require: "^tab"
link: (scope, element, attr, tabController) ->
$log.log "scope=#{scope.$id}, tabController=#{tabController}, bookmark='#{attr.tabBookmark}'"
scope.$watch "active", (newActive) ->
if newActive
$location.search "tab", attr.tabBookmark
scope.$on "$destroy",
$rootScope.$on "activateTab", (tabValue) ->
$log.log "activateTab, tab='#{tabValue}' (looking for '#{attr.tabBookmark}')"
if tabValue is attr.tabBookmark
scope.select()
module.factory "TabSupport", ($log, $routeParams, $rootScope) ->
($scope) ->
$log.log "TabSupport: initializing scope #{$scope.$id}"
$scope.$on "$destroy",
$rootScope.$on "$viewContentLoaded", ->
tabValue = $routeParams.tab
$log.log "TabSupport: tab changed to '#{tabValue}'"
if tabValue
$log.log "TabSupport: broadcasting 'activateTab'"
$rootScope.$broadcast "activateTab", tabValue
为了完成这项工作,我让视图的控制器调用 TabSupport 服务;我也禁用reloadOnSearch
.
我看到的是,即使 $viewContentLoaded 事件也为时过早(令人困惑)。
然后我更改了代码以推迟 activateTab 广播(使用$timeout
)。
现在,在接收到 activeTab 事件之前,监视“活动”表达式的代码过早触发。这是因为当没有显式激活选项卡时,选项卡集会选择第一个选项卡。
那么,任何人都可以提出更好的方法吗?我更喜欢 URL 中的值作为查询参数,但它可以很容易地在本地存储或路径中......但这不是问题。问题在于构造视图及其嵌套指令的操作顺序。
感谢您的任何指点!