【问题标题】:Can a router resolve be set as a function of a controller class?可以将路由器解析设置为控制器类的功能吗?
【发布时间】:2014-11-13 12:36:35
【问题描述】:

背景

我一直在阅读 Todd Motto 的固执风格指南,特别是与路由器解析相关的部分 - 向下滚动到“Controller.resolve property:”部分:

https://github.com/toddmotto/angularjs-styleguide#routing-resolves

我一直不喜欢我在路由器定义中定义了解析逻辑这一事实,所以理论上非常喜欢这个解决方案,但在实践中,我不明白这怎么可能?

托德说:

'这使得解析依赖关系与控制器和路由器在同一个文件中不受逻辑影响'

所以我对此的理解 - 使用他的例子 - 是你将你的控制器逻辑定义在一个文件中(为了参数,controllers.js)定义为,

app.module('myapp')
   .controller('MainCtrl', MainCtrl);

function MainCtrl() {
    ///some controller logic here
}

MainCtrl.resolve = {
    someStuff: function() {
        //resolve something here
    }
}

然后在另一个文件 (routes.js) 中,

app.module('myapp')
   .config(config);

function config ($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl: 'views/main.html',
            controllerAs: 'vm',
            controller: 'MainCtrl'
            resolve: MainCtrl.resolve
     });
}

为了防止污染全局范围,我假设这两个文件逻辑都在 IIFE 中。因此,MainCtrl 唯一存在的地方是 Angular 应用程序中的可注入值。而且由于您无法将控制器注入config,因此它无法知道MainCtrl 是什么,更不用说访问它的resolve 方法了。

问题

或者我是否遗漏了应该实施的方式?

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    查看“IIFE 范围界定”部分:

    为避免我们传递给 Angular 的函数声明污染全局范围,请确保构建任务将连接的文件包装在 IIFE 中”

    我们在编译时这样做,所以没有什么是全局的。我们只需将整个模块包装在一个 IIFE 中,就是这样 :)

    我不建议将 每个 文件包装在 IIFE 中,因为这只是运行时不必要的函数调用,例如,如果您有 1000 个文件。每个模块一个 IIFE 也是一个好方法:)

    【讨论】:

    • Ahhhh,我对 javascript/angular 还是很陌生,但在我提交问题后,我想到了这一点。谢谢托德。
    • 我已经设置了 gulp 来处理这个问题。我正在连接和包装每个模块,然后将整个应用程序连接到一个 build.js 文件中以供开发人员使用。我是否认为您会针对此文件进行开发(将其加载到浏览器中以查看/测试更改),而不是 src,以确保没有范围界定问题或全局范围污染?您是否也会出于同样的原因对此文件进行测试?或者针对你的 src 进行测试?
    猜你喜欢
    • 2015-05-23
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多