首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构对等angularjs控制器中的一些重复代码以管理$intervals的想法

重构对等angularjs控制器中的一些重复代码以管理$intervals的想法
EN

Stack Overflow用户
提问于 2014-02-18 05:19:50
回答 3查看 812关注 0票数 0

我有一个显示多个选项卡的小型SPA。每个选项卡显示与其关联的应用程序的操作状态信息。每个选项卡的控制器创建$interval对象,这些对象对服务器进行AJAX调用以获取状态信息。

为了成为一个好公民,我的结论是,当一个选项卡可见时,应该禁用其他选项卡的$intervals,这样它们就不会调用AJAX。选择另一个选项卡/控制器时,将启用该选项卡/控制器的$interval。

在HTML中,我的每个"tab“元素都有如下属性:

代码语言:javascript
复制
select="selected()" deselect="deselected()"

在与每个选项卡关联的控制器中,我定义了这些方法,它们分别创建和取消与该选项卡关联的$interval。在其中一个选项卡中,我有一个用于该选项卡的控制器,但它有一个包含两个条目的accordion,并且我使用"$broadcast“,以便accordion条目可以管理它们自己的$intervals。

我不喜欢的是,我有几个几乎在每个控制器中都重复的小方法。每个控制器都有一个“选定的”和“取消选定的”方法,所有管理它们自己的$interval的组件都有"startInterval“和"cancelInterval”方法。在大多数选项卡中,这四个选项卡都在选项卡的控制器中。对于使用"$broadcast“的选项卡,我在选项卡控制器中有"selected”和"deselected“方法,在accordion控制器中有"startInterval”和"cancelInterval“方法。

我希望我可以在所有标签的父控制器中定义“选定的”和“取消选定的”,但通过在标签的html中添加一些小的“注册”代码,使这些方法“调用”相关的标签控制器。

但是,在控制器中保存重复项可能会在HTML中以一些看起来很奇怪的代码结束。

有没有办法做得更好?

EN

回答 3

Stack Overflow用户

发布于 2014-02-18 05:28:41

我所做的是添加一个帮助服务来配置我的控制器。如下所示:

代码语言:javascript
复制
angular.module('myModule').service("controllerHelper", function() {

  this.configController = function(controller) {
    controller.oneCommonMethod = function() {/*Some common code*/};
    controller.twoCommonMethod = function() {/*Some more common code*/};
  }

});

angular.module('myModule').controller("myController", function($scope, controllerHelper) {

  controllerHelper.configController(this);

});

您还可以在调用此帮助器服务的控制器之间共享状态,以完成您想要的操作。

票数 4
EN

Stack Overflow用户

发布于 2014-02-18 16:23:01

只是玩玩@Geoff Genz代码

代码语言:javascript
复制
angular.module('app', [])
                .service("controllerHelper", function() {
                    this.configController = function(scope) {
                            scope.test = 'My test';
                    }
                })
               .controller('MainCtrl',function($scope,controllerHelper){
                    controllerHelper.configController($scope);
               });

例如,如果你有一个crud需要一个datepicker配置,你可以利用这个代码

更新

Imo上面的代码违背了oop封装原则。

票数 1
EN

Stack Overflow用户

发布于 2014-02-19 02:37:50

好吧,我没有直接使用这个建议,但我想我的解决方案有一些这样的感觉。

我将每个对象的HTML更改为以下内容:

代码语言:javascript
复制
select="selected(this)" deselect="deselected(this)"

然后,我使用这些元素定义了一个应用程序范围的控制器:

代码语言:javascript
复制
$scope.tabsOpened   = {};

$scope.deselected   =
    function(ctrl) {
        ctrl.tabClosed();
        delete $scope.tabsOpened[ctrl];
    };
$scope.selected     =
    function(ctrl) {
        ctrl.tabOpened();
        $scope.tabsOpened[ctrl] = ctrl;
    };

$scope.$on('$destroy', function() {
    for (var ctrl in tabsOpened) {
        if ($scope.tabsOpened.hasOwnProperty(ctrl))
            ctrl.tabClosed();
    }
});

在每个选项卡的控制器中,我在每个作用域中定义了"tabOpened“和"tabClosed”函数。这就让每个选项卡的控制器来做它的设置和清理。请注意,我还处理了顶部控制器中的$destroy事件,并告诉每个选项卡进行清理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21839470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档