`
姚坤山
  • 浏览: 4020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jhipster angular2 lazyload 权限&国际化整体总结

阅读更多

首先:要修改web打包的懒加载loader:

\webpack\webpack.common.js

修改内容如下:

 module: {
            rules: [
                { test: /bootstrap\/dist\/js\/umd\//, loader: 'imports-loader?jQuery=jquery' },
                {
                    test: /\.ts$/,
                    loaders: [
                        'angular2-template-loader',
                        'awesome-typescript-loader',
                        'angular-router-loader'(增加)
                    ],
                    exclude: ['node_modules/generator-jhipster']
                },

如果不配置就会报这样的错误:

Uncaught (in promise): Error: Cannot find module '/xxx/xxx.module' 

创建一个路由文件:

\src\main\webapp\app\lazy.route.ts

使用loadChildren 进行懒加载:

import { Route } from '@angular/router';

import { NavbarComponent } from './layouts';

export const adminRoute: Route = {
    path: 'admin',
    loadChildren:'./admin/admin.module'这里做出说明带#的提取方式和不带#号的方式可以并存,看被引用模块是否有default关键字
};

export const entityRoute: Route = {
    path: 'entity',
    loadChildren:'./entities/entity.module'
};
export const accountModule: Route = {
    path: 'account',
    loadChildren:'./account/account.module'
};
export const homeRoute: Route = {
    path: 'home',
    loadChildren:'./home/home.module'
};

 给上文做个例子:

import { Route } from '@angular/router';

import { NavbarComponent } from './layouts';

export const adminRoute: Route = {
    path: 'admin',
    loadChildren:'./admin/admin.module'
};

export const entityRoute: Route = {
    path: 'entity',
    loadChildren:'./entities/entity.module'
};
export const accountModule: Route = {
    path: 'account',
    loadChildren:'./account/account.module#TestGateAccountModule'
};
export const homeRoute: Route = {
    path: 'home',
    loadChildren:'./home/home.module'
};

 对应的模块生命中的变化:

src\main\webapp\app\account\account.module.ts

import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { RouterModule } from '@angular/router';

import { TestGateSharedModule } from '../shared';

import {
    Register,
    Activate,
    Password,
    PasswordResetInit,
    PasswordResetFinish,
    PasswordStrengthBarComponent,
    RegisterComponent,
    ActivateComponent,
    PasswordComponent,
    PasswordResetInitComponent,
    PasswordResetFinishComponent,
    SettingsComponent,
    accountState
} from './';
import {customHttpProvider} from "../blocks/interceptor/http.provider";

@NgModule({
    imports: [
        TestGateSharedModule,
        RouterModule.forChild(accountState)
    ],
    declarations: [
        ActivateComponent,
        RegisterComponent,
        PasswordComponent,
        PasswordStrengthBarComponent,
        PasswordResetInitComponent,
        PasswordResetFinishComponent,
        SettingsComponent
    ],
    providers: [
        Register,
        Activate,
        Password,
        PasswordResetInit,
        customHttpProvider(),
        PasswordResetFinish
    ],
    schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class TestGateAccountModule {} // 如果使用 default关键字,就不用‘#’来制定模块名称了 

 但如果你两种方式用混淆的话你就会收到这样的错误:

ERROR Error: Uncaught (in promise): Error: No NgModule metadata found for 'undefined'.(…)

如此这般,懒加载就结束了.

補充:上一版忘記點東西

所有子模塊的
@NgModule({
    imports: [
        BrowserModule,
        LayoutRoutingModule,
        Ng2Webstorage.forRoot({ prefix: 'jhi', separator: '-'}),
        RouterModule.forRoot(LAZY_ROUTES, { useHash: true }),
        RcdisGateSharedModule,
        RcdisGateHomeModule
        // ,
        // RcdisGateAccountModule
    ],
都要改成:
RouterModule.forChild(LAZY_ROUTES),

 

 

但懒加载成功了,程序页面也加载了,但是数据不显示,国际化不能加载还得继续:

第一步解决401数据访问权限错误: jwt 拦截器不能拦截懒加载出来的模块

jwt的http拦截模块:

\src\main\webapp\app\blocks\interceptor

经读代码分析,这个模块需要被手动加载,所以:

来到想要做懒加载的模块定义文件:

\src\main\webapp\app\admin\admin.module.ts(本例)

 

import {customHttpProvider} from "../blocks/interceptor/http.provider";
providers: [
        ……
        customHttpProvider(),
        ……
    ],

 这样程序就工作了,数据加载出来了。

下一步解决国际化加载的问题:

跟上一个问题起因差不多,如果在默认不懒加载的情况下,他是不需要自己去调用国际化服务的,跟着做顺风车就行了,但是自己出来单干(懒加载)什么事情就都得自己干了(调用)

src\main\webapp\app\admin\audits\audits.component.ts(本例)

    constructor(
        ……
        private languageHelper: JhiLanguageHelper,
        private languageService: JhiLanguageService,
        ……
    ) {
……
        this.languageService.setLocations(['all']);
……
    }

 现在说国际化的问题:

这样解决似乎是太琐碎了,要去每个component里去加,但整个模块不管哪个component运行过一次,就不需要再运行第二次了,但还得在每个component里都要写……

 

这个文件的全部代码如下:

import { Component, OnInit } from '@angular/core';
import { DatePipe } from '@angular/common';
import {ParseLinks, JhiLanguageService} from 'ng-jhipster';

import { Audit } from './audit.model';
import { AuditsService } from './audits.service';
import { ITEMS_PER_PAGE } from '../../shared';
import { PaginationConfig } from '../../blocks/config/uib-pagination.config';
import {JhiLanguageHelper} from "../../shared/language/language.helper";

@Component({
  selector: 'jhi-audit',
  templateUrl: './audits.component.html'
})
export class AuditsComponent implements OnInit {
    audits: Audit[];
    fromDate: string;
    itemsPerPage: any;
    links: any;
    page: number;
    orderProp: string;
    reverse: boolean;
    toDate: string;
    totalItems: number;

    constructor(
        private auditsService: AuditsService,
        private parseLinks: ParseLinks,
        private paginationConfig: PaginationConfig,
        private languageHelper: JhiLanguageHelper,
        private languageService: JhiLanguageService,
        private datePipe: DatePipe
    ) {
        this.itemsPerPage = ITEMS_PER_PAGE;
        this.page = 1;
        this.reverse = false;
        this.orderProp = 'timestamp';
        this.languageService.setLocations(['all']);
        this.languageService.addLocation('home');
        this.languageService.changeLanguage("zh-cn");
        this.languageService.init();
        this.languageService.reload();

        alert(JSON.stringify(this.languageService.getCurrent()))
    }

    getAudits() {
        return this.sortAudits(this.audits);
    }

    loadPage(page: number) {
        this.page = page;
        this.onChangeDate();
    }

    ngOnInit() {
        this.today();
        this.previousMonth();
        this.onChangeDate();
        this.languageHelper.getAll().then((languages) => {
            alert(languages);
        });
        this.languageHelper.updateTitle()
    }

    onChangeDate() {
        this.auditsService.query({page: this.page - 1, size: this.itemsPerPage,
            fromDate: this.fromDate, toDate: this.toDate}).subscribe((res) => {

            this.audits = res.json();
            this.links = this.parseLinks.parse(res.headers.get('link'));
            this.totalItems = + res.headers.get('X-Total-Count');
        });
    }

    previousMonth() {
        const dateFormat = 'yyyy-MM-dd';
        let fromDate: Date = new Date();

        if (fromDate.getMonth() === 0) {
            fromDate = new Date(fromDate.getFullYear() - 1, 11, fromDate.getDate());
        } else {
            fromDate = new Date(fromDate.getFullYear(), fromDate.getMonth() - 1, fromDate.getDate());
        }

        this.fromDate = this.datePipe.transform(fromDate, dateFormat);
    }

    today() {
        const dateFormat = 'yyyy-MM-dd';
        // Today + 1 day - needed if the current day must be included
        const today: Date = new Date();
        today.setDate(today.getDate() + 1);
        const date = new Date(today.getFullYear(), today.getMonth(), today.getDate());
        this.toDate = this.datePipe.transform(date, dateFormat);
    }

    private sortAudits(audits: Audit[]) {
        audits = audits.slice(0).sort((a, b) => {
            if (a[this.orderProp] < b[this.orderProp]) {
                return -1;
            } else if ([b[this.orderProp] < a[this.orderProp]]) {
                return 1;
            } else {
                return 0;
            }
        });

        return this.reverse ? audits.reverse() : audits;
    }
}

 源码我简单介绍一下

现在懒加载的国际化入口,我没都做,只做了两个地方:分别是审计和设置,其他模块就自动国际化了,但是你直接进别的模块是不行的。ok处女作

分享到:
评论

相关推荐

    angular-lazyload:基于angular扩展可复用懒加载指令

    #angular-lazyload 关于 基于angular 编写的可复用图片懒加载指令 思路 图片的src不要使用真实地址, 用一个属性保存在元素上 把所有需要使用延迟加载的图片元素放到一个数组中 初始化的时候检查数组中的元素是否在...

    ng-jhipster:JHipster Angular库

    这是JHipster Angular 2+实用程序库 这个库由generator-jhipster生成的代码使用: : 。 发行新版本的generator-jhipster时,将使用生成的package.json文件中引用的ng-jhipster的特定版本进行测试。 如果您的应用...

    angular-lazy-load-demo:延迟加载Angular组件

    运行cd angular-lazy-load-demo 为开发服务器运行ng serve 。 导航到http://localhost:4200/ 学到更多 这些示例应该能够帮助您开始动态加载带有或不带有子级的延迟加载组件。 如果您想了解更多信息,请查看以下...

    Angular4LazyloadAngular4懒加载htmljscss等资源

    Angular 4 懒加载(Lazy Loading)是提高应用程序性能的一种关键策略,它允许我们按需加载模块,而不是一次性加载整个应用。这显著减少了初始加载时间,尤其在大型项目中,用户可以更快地看到应用程序的主要界面,而...

    Angular-lazy-load-img.zip

    Angular-lazy-load-img.zip,发出,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计目的是全面解决开发人员的web应用程序工作流。

    angular 封装全局按钮权限

    在Angular框架中,权限控制是实现安全性与用户体验精细化管理的关键环节。"angular 封装全局按钮权限"这一主题,旨在探讨如何在Angular应用中实现细粒度的权限管理,将权限控制深入到按钮这一级别的元素。这样的设计...

    angular国际化i18n

    总结,Angular 的国际化功能通过一套完整的工作流,让开发者能够轻松地将应用本地化,以满足全球用户的需求。通过正确配置和使用 i18n,不仅可以提供多语言支持,还能确保日期、数字等格式的正确显示,从而提升用户...

    angular2 最新教程(全网首发)

    Angular2的组件化方式使得应用程序的开发变得更加模块化,提高了代码的复用性和可维护性。 Angular2有以下几个核心概念: 1. 组件(Components):是Angular应用中的基础构建块。每个组件都由一个装饰器...

    Switching to Angular 2

    Key Features, Get up to date with the latest changes to Angular 2, including the improvements to directives, change detection, dependency injection, router, and moreUnderstand Angular 2's new ...

    揭秘Angular2 中文扫描版 带书签

    **Angular2 中文扫描版** 是一本专门为开发者深入理解Angular框架技术所编写的权威指南。这本书以中文形式呈现,旨在帮助中国开发者轻松掌握Angular2的核心概念和技术细节。书中内容全面,从基础知识到高级架构,再...

    lazyload源文件

    懒加载(Lazy Load)是一种优化网页性能的技术,主要用于图片、视频和JavaScript等资源的加载。在网页中,不是一次性加载所有资源,而是当用户滚动页面到特定位置或需要时才开始加载,这样可以减少初次加载页面时的...

    ng-LazyLoad:一个基于angular指令的图片懒加载模块,An img lazyload for angular directives

    An img lazyload for angular directives(基于angular指令的图片懒加载) install:bower install https://github.com/chinakids/ng-LazyLoad.git --save use : angular.module('app',['ngLazyLoad']) ..., &lt;img lazy-...

    angular2的demo

    Angular2 的设计理念是组件化,它将网页视为由多个可复用的组件组成,每个组件都有自己的视图和逻辑。在"quickstart-frist"这个文件夹中,可能包含了初始化Angular2项目的基本结构,包括`index.html`作为入口文件,`...

    angular-lazyload-boilerplate

    Angular 延迟加载模块示例应用程序 这个示例项目演示了如何在 Angular 应用程序中延迟加载模块。 它还可以用作与 REST Web 服务交互的 crud 应用程序的样板,它包括: 使用 ui-router 插件路由 带有翻译插件的 I18n...

    Angular框架前端权限实例

    在Angular框架中,前端权限管理是一项重要的功能,它涉及到用户角色、访问控制和安全策略的实施。本实例将深入探讨如何在Angular应用中实现这样的功能。Angular是一个强大的、基于TypeScript的前端框架,由Google...

    angular2 实例源码

    1. **组件系统**:Angular2的核心是组件化,每个组件都是UI的一个独立部分,有自己的视图和逻辑。在源码中,我们可以看到`.component.ts`文件,其中定义了组件的属性、方法和模板。 2. **依赖注入**:Angular2通过...

    angular2-demo

    **Angular2-Demo:探索Angular 2的核心概念与实践** Angular 2,作为Angular框架的升级版,是一个全面重写的JavaScript框架,旨在提供更高效、更模块化和更适应现代Web开发的解决方案。这个"angular2-demo"项目显然...

    angular 实现网站多语言-国际化

    Angular,作为一款强大的前端框架,提供了完善的国际化(i18n)功能,使得开发者能够轻松地实现网站内容根据不同地区和语言的切换。让我们深入探讨如何在Angular应用中实现多语言,以及如何使用提供的示例代码进行...

Global site tag (gtag.js) - Google Analytics