2015-09-19 58 views
0

这里发生了什么是启用了一些菜单项,并在UI中禁用了一些菜单项。因此,当用户点击禁用的菜单项时,页面上会显示错误信息。服务控制器指令之间的相互影响AngularJS

我试图用angularjs-service和$ broadcast来解决这个问题。现在,因为包括左侧菜单的每个页面都有不同的控制器,所以我需要将$广播数据重复到每个控制器。我期待的是我如何消除这种冗余?

左键菜单,Service.js

'use strict'; 
angular.module("MainApp") 
.factory('menuClick', function($rootScope) { 
    var sharedService = {}; 
    sharedService.notify = {}; 

    sharedService.prepForBroadcast = function(msg) { 
     this.broadcastItem(); 
    }; 
    sharedService.broadcastItem = function() { 
     $rootScope.$broadcast('handleBroadcast'); 
    }; 
    return sharedService; 
}); 

左键菜单,Controller.js

'use strict'; 
    angular.module("MainApp") 
.controller('LeftMenuCtrl', function ($scope, $rootScope, menuClick) { 
     $scope.handleMenuClick = function(action) { 
     menuClick.notify.warningNotify = true; 
     menuClick.notify.errorNotify = true; 
     menuClick.notify.successNotify = true; 

     if(!action.IsEnabled) 
     { 
      menuClick.notify.warningNotify = false; 
      menuClick.notify.warningMessage = "This operation is disabled ("+action.Text+")"; 
      menuClick.prepForBroadcast(menuClick.notify); 
     } 
    }; 

}); 

左Menu.html

<li> 
    <a ng-click="handleMenuClick(submenu)">{{submenu.Text}}</a> 
</li> 

通知,Directive.js

'use strict'; 
angular.module("MainApp") 
.directive('notification', function() { 
    return { 
     restrict: 'E', 
     templateUrl: function (tElement, tAttrs) { 
      if (tAttrs.type) { 
       switch (tAttrs.type){ 
        case 'error': 
         return 'partials/template/show_error.html'; 
         break; 
        case 'success': 
         return 'partials/template/show_success.html'; 
         break; 
        case 'warning': 
         return 'partials/template/show_warning.html'; 
         break; 
       } 
      } 
     } 

    }; 
}); 

show_error.html

<div ng-hide="notify.errorNotify" ng-init="notify.errorNotify=true"> 

    <button type="button" ng-click="notify.errorNotify = !notify.errorNotify"></button> 
    <h2>{{notify.errorMessage}}</h2> 

</div> 

控制器 - 的最全的的页面,在那里,这个指导性,是-used.js

$scope.$on('handleBroadcast', function() { 
     $scope.notify = menuClick.notify; 
}); 

我不知道如何打补丁指令本身的全部内容,以避免在所有控制器中重复上述代码。谢谢!

+1

我不知道我完全理解你的问题,但我看到你正在为你的应用的每个部分制作单独的模块:)很高兴看到更多人这样做。我有一个例子,我把[在这里](https://github.com/joeLloyd/DoingAngularRight)放在一起。看看应用程序/共享/导航栏。在这里你会发现一个我建立的用来添加导航栏和控制器的指令。希望这有助于帮助 –

+0

@JoeLloyd OP代码中只有一个模块,不确定你的意思是什么*单独的模块* – charlietfl

+0

@charlietfl啊我刚刚读了他的模块名,我分心了。我的错。但是看看我的示例,无论如何,您可以看到一个指令以及功能如何成为模块。 –

回答

1

这可能不是理想的答案,但会帮助您了解如何使用服务共享方法。

从控制器移动功能声明$scope.handleMenuClick为您服务:

.factory('menuClick', function($rootScope) { 
    var sharedService = {}; 
    sharedService.notify = {}; 
    // new function 
    sharedService.handleMenuClick = function(action) { 
     sharedService.notify.warningNotify = true; 
     ....... 
     if(!action.IsEnabled) 
     ....... 
    } 
    ..... 
    return sharedService 
}) 

然后在控制器,你只需要一个参考的方法服务:

$scope.handleMenuClick = menuClick.handleMenuClick; 
+0

ThankYou,但你仍然需要重复$ scope.handleMenuClick = menuClick.handleMenuClick;对每个控制器不是吗? – Jinandra

+0

不一定如果菜单被放入指令或只是使用它自己的控制器。我们不知道你如何看待你的观点 – charlietfl

+0

对于两者来说都是。菜单已被放入指令并拥有自己的控制器。 – Jinandra

相关问题