index.html
<body ng-app="dnaClientApp" ng-controller="MainCtrl">
<ul class="nav navbar-nav navbar-collapse">
<li ng-repeat="item in menu" ng-class="{active: item.route === menuActive }"><a href="#{{item.route}}">{{item.label}}</a>
</li>
</ul>
MainCtrl main.js
.controller('MainCtrl', function ($scope, $route, $rootScope, $location, $cookies, translationSvc, $http, $cookieStore, UserService) {
if (typeof $scope.selectedLanguage === 'undefined') {
$scope.selectedLanguage = 'fi';//Default language
}
translationSvc.getTranslation($scope, $scope.selectedLanguage);
$scope.menu = translationSvc.getMenu($scope.selectedLanguage);//Creating menus dynamically
console.log('$scope.menu-->' + $scope.menu + ' length: ' + $scope.menu.length);
$scope.menuActive = '/';
$rootScope.$on('$routeChangeSuccess', function (e, curr, prev) {
$scope.menuActive = $location.path();
});
翻译服务
var getMenu = function($scope, language) {
if (language === 'fi' && typeof $rootScope.userRole !== 'undefined' && typeof $rootScope.userRole.currentUserRole !== 'undefined' && $rootScope.userRole.currentUserRole.userRole === 3 ) {
$scope.menu = [
{label: 'Home', route: '#/'},
{label: 'DNA', route: '#/dna'},
{label: 'Dna-list', route: '#/dna-list'},
{label: 'Admin', route: '#/admin'}
]
}else...
登录后的路由在这里,菜单在index.html
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
问题
如果我检查 Controller 中菜单数组的长度,一切正常,但标题中的菜单都是相同的默认菜单(3 个菜单,而不是 4 个)。我做错了什么或者为什么我不能动态更新菜单?想法是为不同的 Angular 色获得不同的菜单,例如管理员也可以看到管理菜单等。还有其他可行的想法来完成这项工作吗?
最佳答案
我不喜欢将 $scope
传递给服务的想法。它使服务阅读起来非常困惑,因为您不知道它正在更改哪些数据。相反,为什么不直接在 translationSvc.getMenu()
中构建菜单并将其返回给 MainCtrl
。我不明白为什么这样的事情不应该工作,除非你没有发布的代码正在做其他事情。
Controller :
.controller('MainCtrl', function ($scope, $route, $rootScope, $location, $cookies, translationSvc, $http, $cookieStore, UserService) {
...
// Creating menus dynamically
$scope.menu = translationSvc.getMenu($scope.selectedLanguage);
...
}
翻译服务:
var getMenu = function(language) {
var newMenu = []
if (language === 'fi' && typeof $rootScope.userRole !== 'undefined' && typeof $rootScope.userRole.currentUserRole !== 'undefined' && $rootScope.userRole.currentUserRole.userRole === 3 ) {
newMenu = [
{label: 'Home', route: '#/'},
{label: 'DNA', route: '#/dna'},
{label: 'Dna-list', route: '#/dna-list'},
{label: 'Admin', route: '#/admin'}
];
} else if (...) {
newMenu = [...];
} else {
newMenu = [...];
}
return newMenu;
}
我认为您遇到了在 Angular 领域之外更新 $scope
的问题,即 Angular 无法知道您正在更改 $scope
在 translationSvc
中,因此您的更改不会传播到您的 View (index.html
)。
我还建议沿相同的行编辑 translationSvc.getTranslation()
并删除将 $scope
传递给该函数。
关于javascript - 在 AngularJS 应用程序中登录后动态更改菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807199/