如果您使用路由,您可以在路由提供程序的resolve
块中对每个路由更改运行一些逻辑。
在下面的示例中,我使用了一个自定义 SystemService 服务,该服务存储位置,然后在 $rootScope 上广播一个事件。在这个例子中,导航在路由控制器管理的视图之外并且有它自己的控制器:
app.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/', {
templateUrl: 'partials/welcome.html',
controller: 'WelcomeCtrl',
resolve: {
load: function(SystemService){
SystemService.fireNavEvent({showNav:false,location:'/'});
}
}
}).
when('/other', {
templateUrl: 'partials/other.html',
controller: 'ElseCtrl',
resolve: {
load: function(SystemService){
SystemService.fireNavEvent({showNav:true,location:'/other'});
}
}
}).
otherwise({
redirectTo: '/'
});
}]);
// 在系统服务中:
function fireNavEvent(obj){
this.showNav = obj.showNav;
$rootScope.$broadcast('navEvent',obj);
}
// 然后在导航控制器中:
$scope.$on("navEvent", function(evt,args){
$scope.showNav = SystemService.showNav;
// also some logic to set the active nav item based on location
});
还有其他方法可以实现这一点,例如,您可以$rootScope
直接从路由配置中广播导航更改。
您还可以将 $location 注入您的控制器并基于此设置可见性。