Angular 学习笔记 (version 6 小笔记)

摘要:
1.lazyload的path变成相对路径了,不过如果你用ngupdate的话,依然可以不需要修改,cliconfig好像能调支持绝对路径的写法.constroutes:Routes=[{path:'',loadChildren:'./home/home.module#HomeModule'},];2.新的providers依赖注入机制treeshakeable(可树摇)从前我们通过在module

1. lazyload 的 path 变成相对路径了, 不过如果你用 ng update 的话, 依然可以不需要修改, cli config 好像能调支持绝对路径的写法.

const routes: Routes =[
  { path: '', loadChildren: './home/home.module#HomeModule'},
];

2. 新的 providers 依赖注入机制 tree shakeable (可树摇)

从前我们通过在 module.providers 或 component.providers 提供我们的服务生产方式.

即使最后没有任何组建 inject 这些服务,但是最终的 bundle js 里依然会有这些代码.这不好.

所以提供了一种新的写法 ProvideIn

import { Injectable, InjectionToken, inject, LOCALE_ID, Inject } from '@angular/core';

export let AbcServiceConfig = new InjectionToken<string>('AbcServiceConfig', {
  providedIn: 'root',
  factory: AbcServiceConfigFactory
});
export functionAbcServiceConfigFactory(): string {
  returninject(LOCALE_ID);
}

@Injectable({
  providedIn: 'root',
  //useFactory : () => new AbcService('tata')
})
export class AbcService {
  name = 'keatkeat'constructor(
    @Inject(AbcServiceConfig) private dada: string
  ) {
    this.name =dada;
  }
}

写了 ProvideIn 就不需要去写 module.providers 了 (当然你要写还是可以的, 以前的机制依然可以使用,并没有冲突)

新的机制下,只要没有 inject 服务,那么 tree shake 可以完全把这个服务代码移除. 不会在最终的 bundle.js 里面.

我个人觉得这个新机制并不太容易理解. 我做了一些测试,得出了一些结论.

1. provideIn : 'root' 全局服务

-这个可以对应从前的 module.providers. 但有一点要注意.

module.providers 会因为 lazyload 而产生特别的结果 (本来 module.providers 应该是全局单列, 但是lazyload会把它变成不是全局)

而 providerIn : 'root' 一定是全局单列,即使你在 lazyload 的 module.component 才注入服务.

-angular bundle 很厉害, 虽然你表示 'root' 全局,但是如果在 firstload 的时候没有人注入服务,而是等到 lazyload 后才注入服务, angular bundle 会分开打包. 只有 lazyload 的 bundle.js 才有这个服务的代码.

-如果服务依赖其它服务, 那么必须确保其它服务也能在 root injector 里被找到. 比如上面代码 factory 里使用了 angular/core inject() 这个是有作用域概念的, 'root' = root injector.

-绝大部分的时候我们都应该使用 'root'.

2.provideIn : ServiceModule

简单说是这样, 用一个 module 把 service 包起来, 任何要使用这个 service 的人必须通过自己的 module 去 import或间接 import 这个 ServiceModule

它做的事情是把 ServiceModule 包好的服务放入 ComponentModule.providers 里 ComponentModule importServiceModule =ComponentModule.providers : [...ServiceModule.Serivces]

这个主要的目的就是替代之前的写法. 因为 providers 不可以树摇和 lazyload 分 bundle 打包, 而替换成这个写法后就变得可以了.

3. 从前需要通过注入 pipe 才能完成, 现在很方便了.

import { formatDate, formatNumber, FormatWidth } from '@angular/common';

免责声明:文章转载自《Angular 学习笔记 (version 6 小笔记)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Xrdplibcurl教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AngularJS学习笔记(一) 关于MVVM和双向绑定

写在前面:      因为需要开始学习ng,之前在知乎上听大神们介绍ng的时候说这个坑如何的大,学了一阵(其实也就三天),感觉ng做的很大很全,在合适的情境你可以完全使用ng搞定一切。这一点从诸如jqLite之类的鸡肋就能看出来了。所以搞得ng很大。。     更主要的是,ng用一种和之前完全不同的思维方式去组织代码,它就是Model-View-ViewM...

angularJs学习笔记-入门

1.angularJs简介   angularJs是一个MV*的javascript框架(Model-View-Whatever,不管是MVVM还是MVC,统归MDV(model drive view)),其实是由google推出的SPA(single-page-application)应用框架。它的用于 数据在后端和前端之间的双向绑定。这就意味着你在后台...

angularjs-双向数据绑定之输入框信息随时显示

以下为angularjs 双向数据绑定用处之一:用户输入框输入信息,随着用户信息的输入,信息随时显示在某元素中 双向数据绑定如果不需要对输入数据有任何操作,只是把用户输入的信息显示在页面中,则不需要对<div ng-app=''>里面写任何任内,只需要谢伟空字符即可;一个为用户输入信息元素绑定ng-model='起的名字',显示元素为绑定方式为...

(转)Android SlidingTabLayout定制分割线和指示条颜色

本文转载与:http://blog.csdn.net/zhangphil/article/details/48863347 Android SlidingTabLayout默认的滑动指示条是系统默认的某个蓝色系色值,分割线是灰色。如果要自定义实现滑动指示条和分割线定制颜色,则主要通过SlidingTabLayout的setCustomTabColoriz...

angular1.5 组件学习 -- 1、组件的基本结构

angular 1.5 新增了组件功能,一个简单的组件要包括两项:模板、控制器。 1、模板,可以是一段html内容,也可以是引用html文件的路径 2、控制器,则跟我们的 controller 的使用大致相同。 <!DOCTYPE html> <html ng-app="myApp"> <head> <me...

关于 angular 项目 结合 RequireJs 的问题整理

1、在 将 依赖的js 通过 require.config 设置 映射的时候,结合dataTables.bootstrap.js和 jquery.dataTables.js 时 遇到如下报错: Uncaught Error: Script error for "datatables.net", needed by: dataTablesbootstrap;...