延迟加载 angular 1.5 个组件

Lazy load angular 1.5 components

我正在构建一个 angular 应用程序,我只想在请求该路由时加载我的组件。我认为这样的事情可能会奏效

const states = [{
    name: 'login',
    url: '/login?sessid',
    component: 'login',
    resolve: {
      login: () => import('./components/login.js').then(login => {
        login.default.register()
      }),
    },
}];

登录组件在哪里

export default {
      register() {
        angular.module('trending')
          .component('login', () => ({
              template: 'Hello!'
            })
        )
    }
};

但是我得到一个错误

angular.js?10a4:13708 Error: [$injector:unpr] Unknown provider: 
loginDirectiveProvider <- loginDirective

大概是因为登录组件没有在状态之前注册。我意识到这是在滥用 resolve 属性 的目的,我只是希望它能满足我的需要。解决此问题的更好方法是什么?

应用启动后,您将无法再声明组件。因此,为了在 运行 时间注册组件,您必须以某种方式公开相应的工厂。下面的代码公开了主应用程序模块上的所有工厂,但如果您愿意,您可以只使用组件。

const app = angular.module('trending', []);

app.config(($controllerProvider, $compileProvider, $filterProvider, $provide) => {
    app.register = {
        component: $compileProvider.component,
        controller: $controllerProvider.register,
        directive: $compileProvider.directive,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
});

这样,您只需调用 app.register.component 即可访问公开的工厂。例如,取自您的问题:

export default {
      register() {
        angular.module('trending')
          .register
          .component('login', () => ({
              template: 'Hello!'
            })
        )
    }
};

You might find a fancier way to register your modules, this is just a demonstration for the sake of the answer, you can either change the nomenclature used or even the exposing mechanism to fit better on your fancy es6+ components.