AngularJS涉及$ scope时,在控制器之间共享功能的更好方法?

时间:2014-03-13 11:14:03

标签: arrays angularjs

我使用angular是非常新的,当涉及到范围时,我不知道在控制器之间共享功能的最佳方式是什么(在其他情况下,我理解解决方案是创建服务。)

我已经为两个可能的解决方案写了一个jsfiddle,但我不相信任何一个:

http://jsfiddle.net/zemogc/LQ59p/

该示例包括显示具有特定类型的消息。在示例中,消息和类型由表单给出(按钮上的deppending称为soution或其他),但在我的应用程序中,将会有许多不同页面中的许多控制器可以显示消息(以及消息div)将包含在ng-include中)所以我以两种不同的方式创建了一个名为ManageMes​​sage的函数:

  • ManageMes​​sage服务。它有效,但我需要将$ scope作为变量传递。不是很漂亮。
    $scope.changeMessageService = function (messageText, messageType){
        ManageMessage.set($scope, messageText, messageType);
    };
  • ManageMes​​sageCtrl。它也有效,但我需要从MainCtrl调用$ controller方法,并将范围作为变量传递。我正在搜索$ controller的使用,我发现它特别用于测试用例,所以这个解决方案也不能说服我。
    $scope.changeMessageController = function (messageText, messageType) {
        $scope.message = messageText;
        $scope.messageType = messageType;
        $controller('ManageMessageCtrl', {
            $scope: $scope
        });
    };

那么实现ManageMes​​sage从不同控制器使用的最佳方法是什么? (现在我问一个具体问题,但我的问题是通用的,我试着在标题中恢复它。)

如果我的英语不好,请提前致谢并表示歉意。

1 个答案:

答案 0 :(得分:1)

对于此问题,我建议将status$scope分开。所以,想法是这样设计:

<强> statusService.js

angular.module('app').factory('statusService', [function() {

   return {
      getStatus: function(messageType) {

         status = {};  // could set some defaults here
         switch (messageType) {
            case 'error':
                status.isOk = false;
                status.isLoading = false;
                status.isError = true;
                status.noMessage = false;
                break;
            case 'ok':
                status.isOk = true;
                status.isLoading = false;
                status.isError = true;
                status.noMessage = false;
                break;

            case 'loading':
                status.isOk = false;
                status.isLoading = true;
                status.isError = false;
                status.noMessage = false;
                break;
            case 'none':
                status.message = '';
                status.noMessage = true;
                break;
        }

        return status;
      }
   }
}]);

<强>控制器

myAppControllers.controller('ManageMessageCtrl', ['$scope', 'statusService', function ($scope, statusService) {
    if ($scope.message === '') {
        $scope.messageType = 'none';
    }

    var status = statusService.getStatus($scope.messageType);

    $scope.isOk = status.isOk;
    $scope.isLoading = status.isLoading;
    $scope.isError = status.isError;
    $scope.noMessage = status.noMessage;
    $scope.message = status.message;    

}]);