【问题标题】:How to DRY up $scope-manipulating code across controllers in angularJS如何在 angularJS 中跨控制器干燥 $scope 操作代码
【发布时间】:2016-11-30 01:42:44
【问题描述】:

如果这个问题是一个彻底的吹嘘,请原谅......刚刚开始热身到世界 angularJS。

我有这两个控制器:seekerControllerwizardController...

wizardController 内部,我有一个chat Scope 对象,并且我已经实现了一系列操作这个chat Scope 对象的函数。

现在回到另一个控制器,(seekerController),我发现我需要基本上直接复制这个chat Scope 对象和所有其他操作它的函数,就像我在wizardController 里面一样。 /p>

显而易见的方法是将所有这些复制到我的另一个控制器中,我的工作不到一分钟就完成了,但是我到处都会有很多重复的东西......

所以:我正在寻找一种方法,我可以在一个地方拥有这个(代码),但仍然能够从两个控制器以及所有其他控制器访问这个 chat Scope 对象功能无缝衔接。

更新 - 添加代码示例:

//seekerController
angular.module('cg.seeker', [])
    .controller('SeekerController', ['$scope', 'seekerService', 'timeService', 'chatService', '$stateParams', 'toastr',
      function ($scope, seekerService, timeService, chatService, $stateParams, toastr) {
        ...
        // THE CHAT BUSINESS
        $scope.chat = { close: true };
        chatService.unreadCount(function(count){
          $scope.chat.unreadCount = count;
          $scope.$apply();
        });

        chatService.listDialogs( function (dialogList) {
          $scope.chat.dialogList = dialogList.items;
          $scope.$apply();
        } );

        $scope.endChat = function () {
          $scope.chat.close = true;
        }

        $scope.chatBox = function (dialogId, occupants_ids) {
          $scope.chat.opponentId = getOpponentId(occupants_ids);
          chatService.getMessages( dialogId, function (messageList) {
            $scope.chat.messages = messageList.items;
            $scope.chat.close = false;
            $scope.$apply();
          });
        }

        var getOpponentId = function (opponentId) {
          if(typeof(opponentId) != 'object') {
            return opponentId;
          } else {
            return opponentId.filter(function(x) { return x != $scope.seeker.chat_user.chat_id_string; })[0];
          }
        }

        $scope.sendMsg = function (opponentId) {
          var msg = {
            type: 'chat',
            body: $scope.chat.msg,
            extension: {
              save_to_history: 1,
            }
          };

          chatService.sendMsg(opponentId, msg);
          $scope.chat.msg = '';
        }

     ...

我现在在第二个控制器WizardController 中有上述代码的精确副本。完全一样,没有任何变化……甚至第三个控制器也有一些,但不是全部。

【问题讨论】:

  • 一个代码值一千字...
  • 如果您在WizardControllerseekerController 中有相同的代码,那么您真的需要两个不同的控制器吗?你不能使用单个控制器吗?
  • @JyothrilingaK 谢谢,但这不是控制器中唯一的一段代码......每个控制器中都有更多非常不同的代码。只是上面的 sn-p 对两者都是通用的,这就是我想干掉的。

标签: javascript angularjs dry


【解决方案1】:

angularjs 控制器的下一级抽象是

  • 工厂
  • 服务
  • 提供者

您可以使用一个名为 chatService 的服务,它可能包含公共代码。您可以将服务注入任何需要通用功能的控制器并调用Service 上的方法。

请注意,即使我在上面的声明中只提到了Service,您也可以使用上述三个选项中的任何一个。

编辑 1:

您可以将代码的公共部分从 Controller 移动到 Service。 例如:- 您可以将 msg 对象的构造从控制器移动到 chatService。你的控制器很简单 -

$scope.sendMsg = function (opponentId) {
      chatService.sendMsg(opponentId);
      $scope.chat.msg = '';
    }

而您的chatService 将会努力工作。

    $chatService.sendMsg = function (opponentId) {
      var msg = {
        type: 'chat',
        body: $scope.chat.msg,
        extension: {
          save_to_history: 1,
        }
      };

      sendMsg(opponentId, msg);
    }

在简化 Controllers 之后,您可以重新访问,看看您是否可以只使用一个控制器而不是 3 个,因为它们似乎在执行类似的功能。

【讨论】:

  • 我实际上已经有一个chatService 可以看作是注入到我的控制器中......我不知道的是可以在服务内部操作范围吗?因为这是因为 chat scope 对象,我的控制器中有那些重复的代码。
  • @sundayAdefila 让一个控制器与所有 3 个控制器的代码合并是否可行?
  • 恐怕一个控制器会很臃肿,在不同的模板上做很多不相关的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多