【问题标题】:how to execute the same init code on each controller instantiated by $routeProvider?如何在 $routeProvider 实例化的每个控制器上执行相同的初始化代码?
【发布时间】:2014-11-28 08:23:53
【问题描述】:

在我的 .config 中,我有一个实例化一对 controller-router 的路由器:

angular.module('reporting', ['ng', 'ngRoute', 'ngResource', 'reporting.directives', 'reporting.controllers', 'reporting.config', 'ngGrid', 'ui.bootstrap'])
    .config(["$routeProvider", "$provide", function ($routeProvider, $provide) {
        $routeProvider
            .when('/dealersReq', {
                templateUrl: 'reporting/partials/dealersReqs.html',
                controller: 'DealersCtrl'
            })
            .when('/lmtReq', {
                templateUrl: 'reporting/partials/lmt.html',
                controller: 'lmtCtrl'
            })
            .when('/leadsCreated', {
                templateUrl: 'reporting/partials/leadsCreated.html',
                controller: 'LeadsCreatedCtrl'
            })
...

但每个控制器共享相同的 initialization code(将其视为构造函数),在 rootScope 中设置一些变量,如标题和其他有用信息,用于 <view> 之外的某些控制器:

.controller('DealersCtrl', ['$scope','$rootScope', 'CONFIG',
    function($scope, $rootScope, CONFIG) {

        //////////// duplicated code

        var key = 'qtsldsCrtSncheQ';

        $rootScope.openReport.key = key;
        $rootScope.openReport.title = CONFIG.reports['' + key].title;

        //////////// duplicated code

        console.log('Initialized! Now I do what a controller should really do');
    }]);

我想做的是找到一种方法将代码(目前已复制到每个控制器中)移动到更智能、更整洁的东西中。例如,在路由实例化期间路由可以调用的东西。当然,每个控制器都应该有一个不同的键,但实际上那个键可能正是控制器名称。我真的不知道如何改善这一点。有什么建议吗?

【问题讨论】:

  • 我经常觉得控制器应该具有“之前”功能,您可以说“在运行任何控制器之前运行此代码”。在“旧”时代,我使用 sammyjs 进行客户端路由,它支持“之前”功能,该功能在每个路由的处理程序之前运行。

标签: angularjs angular-routing


【解决方案1】:

您可以将服务用于共享代码,但应避免使用 $rootScope https://stackoverflow.com/a/16739309/3068081

【讨论】:

  • 是的,我写 $rootScope 是为了清晰起见,但实际上有一个指令范围包含我需要的一切
  • $service 可以完成这项工作,是的,但我应该记得在每个 controller 中调用该服务。没有我想的那么聪明:-)
  • 是的,在过去的个人项目中,我看起来像是一个控制器遗产,但所有答案都以服务解决方案结束:S
  • 一位同事向我推荐了decorator。但他也说“尽量避免”
【解决方案2】:

为什么不在$rootScope 上创建一个方法,然后从每个控制器调用它,即:$rootScope.init()

【讨论】:

  • 我想避免的是在每个控制器中进行调用。迟早我会忘记的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多