在路由的resolve中使用lazyload加载控制器无效

发布于 2022-09-02 14:20:16 字数 2086 浏览 28 评论 0

背景:
webpack打包
angular-ui-router配置路由
angular1.4.7
ocLazyLoad

// ../layouts/layouts.controller.js       
export default function layoutsController($scope) {
    'ngInject';
    console.info('layoutsController:', 'controller is loaded');
}
// ../layouts/index.js
import layoutsController from './layouts.controller.js';

let layoutsModule = angular
    .module('layouts', [])
    .controller('layoutsController', layoutsController);
    
export default layoutsModule.name;
//写法1
$stateProvider
        .state('app', {
            url: '/app',
            template: require('./views/app.html'),
            controller: 'layoutsController as vm',
            resolve: {
                loadLayoutsController: function($q, $ocLazyLoad) {
                    console.info('state resolve:', 'app, layoutsController');
   
                    var deferred = $q.defer();
                    let layoutsModule = require('../layouts');
                    $ocLazyLoad.load(layoutsModule);
                    deferred.resolve();
                    return deferred.promise;
                }
            }
        });
       
//写法2       
$stateProvider
        .state('app', {
            url: '/app',
            template: require('./views/app.html'),
            controller: 'layoutsController as vm',
            resolve: {
                loadLayoutsController: function($ocLazyLoad) {
                    console.info('state resolve:', 'app, layoutsController');
                    let layoutsModule = require('../layouts');
                    return $ocLazyLoad.load(layoutsModule); 
                }
            }
        });

采用写法1时能够正常打出
console.info('state resolve:', 'app, layoutsController');
console.info('layoutsController:', 'controller is loaded');两条信息
采用写法2时只能够正常打出
console.info('state resolve:', 'app, layoutsController');一条信息,layoutsController没有正常运行。

请问这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒绊 2022-09-09 14:20:16

自己折腾了一下,发现了以下内容:

几点发现

  1. ES6的导出机制与commonjs的模块导出机制不同

  2. ES6的export default导出的模块,在webpack中require进来后是一个具有default属性的对象;若使用import得到结果与导出一致

  3. module.exports导出的模块require得到结果与导出一致

  4. $ocLazyLoad.load({name: moduleName}) 来加载模块,当直接写字符串$ocLazyLoad.load(moduleName)时好像会被认为是文件(这部分还有待确定,具体可以扒 oclazyload 的源码)

方案概括

  • ES6 export default+require,使用layoutsModule.default(非default请根据导出名提取)

  • ES6 export+ES6 import,使用layoutsModule

  • module.exports+require,使用layoutsModule

代码如下

let layoutsModule = require('../layouts').default;
// or
import layoutsModule from '../layouts';

resolve: {
    loadLayoutsController: function($ocLazyLoad) {
        return $ocLazyLoad.load({name: layoutsModule}); 
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文