我正在制作一个连接群集的网络应用,所以99%的时间,我的网址会像:/cluster/cluster_name/something/else
。由于路线是动态的,我需要在导航栏中动态生成ng-href。
现在,我有一个解析URL并将其传递给索引模板的服务:
app.factory('GetCluster',function($location) {
return {
cluster: {name: $location.path().split('/')[2]}
};
});
然后在导航控制器中我有这个:
function NavigationController($scope, $location, GetCluster) {
$scope.cluster = GetCluster.cluster.name;
$scope.isActive = function (viewLocation) {
return viewLocation === $location.path()
}
最后在模板中:
<div class="sidebar-nav navbar-collapse" ng-controller="NavigationController">
<div ng-if="cluster">
<ul class="nav" id="side-menu">
<li><a ng-class="{ active: isActive('/') }" ng-href="/#!/"><i class="fa fa-home"></i> Home</a></li>
<li><a ng-class="{ active: isActive('/cluster/' + cluster) }" ng-href="/#!/cluster/{{ cluster }}"><i class="fa fa-sitemap"></i> Cluster</a></li>
<li><a ng-class="{ active: isActive('/cluster/' + cluster + '/nodes') }" ng-href="/#!/cluster/{{ cluster }}/nodes"><i class="fa fa-hdd-o"></i> Nodes</a></li>
<li><a ng-class="{ active: isActive('/cluster/' + cluster + '/namespaces') }" ng-href="/#!/cluster/{{ cluster }}/namespaces"><i class="fa fa-database"></i> Namespaces</a></li>
<li><a ng-class="{ active: isActive('/cluster/' + cluster + '/views') }" ng-href="/#!/cluster/{{ cluster }}/views"><i class="fa fa-search"></i> Views</a></li>
<li><a ng-class="{ active: isActive('/cluster/' + cluster + '/tasks') }" ng-href="/#!/cluster/{{ cluster }}/tasks"><i class="fa fa-tasks"></i> Tasks</a></li>
</ul>
</div>
<div ng-if="!cluster">
<ul class="nav" id="side-menu">
<li><a ng-class="{ active: isActive('/')}" ng-href="/#!/"><i class="fa fa-home"></i> Home</a></li>
</ul>
</div>
这样可行,但是如果我切换到另一个群集,ng-href仍然指向旧群集。我必须在浏览器中刷新页面才能显示正确的链接。
我已经尝试将服务的返回包装到$rootScope.$apply()
但是没有用。它与$digest already in progress
。
我该如何解决这个问题?
谢谢,
答案 0 :(得分:1)
尝试这样的服务:
app.factory('GetCluster',function($location) {
return {
cluster: function() {
var path = $location.path().split('/');
return path[2];
}
}
});
然后调用控制器中的集群功能:
$scope.cluster = GetCluster.cluster();
如果需要,您可以将路径位置作为参数传递,以便从您的服务返回。