javascript - 在 AngularJS 应用程序中登录后动态更改菜单

标签 javascript html angularjs

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 无法知道您正在更改 $scopetranslationSvc 中,因此您的更改不会传播到您的 View (index.html)。

我还建议沿相同的行编辑 translationSvc.getTranslation() 并删除将 $scope 传递给该函数。

关于javascript - 在 AngularJS 应用程序中登录后动态更改菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807199/

相关文章:

javascript - 在子文件夹中运行的 Angular 7 中的路由无法正常工作

javascript - AngularJS RequireJS Browserify 和 Javascript 模块/全局范围的噩梦

javascript - 为什么 window.onload = launchFullscreen(document.documentElement);不行?

javascript - 使用 rowspan 调整表的大小

javascript - 外部 JavaScript 未运行,不写入文档

html - 水平和垂直居中跨度和图像

javascript - 在 IE11 中使用 Angular 记录显示奇怪的行为

javascript - 如何为 Chrome 扩展创建卸载 url 和图标 url?

javascript - 当可观察数组中的对象的属性更新时,如何使可观察数组通知其依赖项?

javascript - ng-重复错误 : "Duplicates in a repeater are not allowed"