核心:组件
React->UI组件(V)
- React,虚拟DOM,更新DOM次数少,内容也少。速度快
- FlUX架构(UI组件化和数据单向更新)
- 服务器渲染(预渲染应用发送客户端,爬虫依赖服务器的响应)
Vue->雨溪大牛个人主导,只关注WEB,服务器渲染(缺点)
- 简单
- 灵活
- 性能
Amber Cli(模块的构建) -> Angular CLI <- Webpack(打包)
- Angular CLI (2以上的构建工具)
- npm install -g @angular/cli (安装)
- ng version
- ng new 项目名字 –skip-install(网络不好1)
- cnpm install(网络不好2)
- 编译,开发同步 np serve
- 测试打包 test build
安装报错
constructor(_configPath, schema, configJson, fallbacks = []) {
重装
npm uninstall -g angular-cli
npm cache clean
C:\Users\null\AppData\Roaming\npm\node_modules\@angular\cli\models\config\config
.js:17
constructor(_configPath, schema, configJson, fallbacks = []) {
^
SyntaxError: Unexpected token =
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:373:25)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (C:\Users\null\AppData\Roaming\npm\node_modules\@angul
ar\cli\models\config.js:3:18)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
升级Node version 6.x or higher
Linux
npm install -g n
n stable
window直接替换就行了
运行报错
The "@angular/compiler-cli" package was not properly installed.
- Global package:
rm -rf node_modules dist
npm uninstall -g @angular/cli
npm cache clean- Reinstall and play (global)
npm install -g @angular/cli@latest
npm install
ng serve
https://stackoverflow.com/questions/42925690/angular2-cli-error-angular-compiler-cli-package-was-not-properly-installed/43021209
@Component**组件元数据装饰器**可以让开发者通过Angular 的Component创建一个类似Java的class,并同时提供额外的元数据用于定义在运行环境中,根据元数据的值来渲染组件,这个component将如何运行/实例化以及被使用。
Template 定义组件的外观
Controller包含组件的所有属性和方法,页面逻辑,处理模板上发生的事件
@NgModule
angular-cli.json
- 启动加载页面 index.html
- 启动加载脚本 main.ts
- 脚本的工作 导入依赖模块,主模块app.module.ts,主模块的依赖模块…….在index.html寻找启动模块的主组件对应的css选择器
利用url分配视图状态
- 子路由
- 保护路由
- 辅助路由
ctrl + 1 导入component
ng new project routing
生成一个路由模块
app-routing.modul.ts路由配置,不用/开头
const routes : Routes = [
{path:'',component:IndexComponent },
......
]
第一种:
路由使用,使用数组是要解决增加传参的问题,字符串不方便
"['/']" > 主页
第二种:
"button" value="主页" (click)= "toIndex()" 事件绑定
控制器中定义
export class AppComponent {
constructor(private router: Router){}
toIndex(){
this.router.navigate(['/']);
}
}
404组件,通配符定义 **解决输入未定义路径报错的情况**
{path:'**',component:404Component },
404组件页要放在最后,因为Ag路由使用先配置,先匹配的原则。
查询参数传递参数
/product?id=1&name=2 => ActiveRoute.queryParams[id]
路由路径传递参数
{path:/product/:id} => /product/1 => ActivatedRoute.params[id]
路由配置传递参数
{path:/product,component: ProductComponent,data:[{isProd:yrue}]}
=> ActivatedRoute.ata[0][isProd]
自组件html:
{{ productId }}
定义:
{path:product/:id”,component:ProductComponent },
html:
<a [routerLink] = "['/product',1]" > 主页 a>
子组件:prams 替换queryParams
问题:当我们进行相同组件(参数不同)的路由切换时,无法正常切换(不能切换)?
问题来源:组件只创建一次,创建时constructor,ngOnInit被调用
问题解决:参数快照(snapshot) -> 参数预定
生成子组件=>定义模板内容=>接收路由参数=>添加子组件=>添加子组件连接
主路由(组件只在主路由显示):
outlets:{primary:'home',aux:"chat"}
通过返回的布尔值判断执行动作。
注意CanDeactivate多了一个泛型,也就是要声明一下要保护的组件
Resolve守卫要解决的问题就是当我们发送一个HTTP请求,要求路由切换时,请求是有延迟的,模板上的{{数据}}不能及时显现出来。可以在进入路由之前读取数据,立刻显现数据(略)
在调用一个类的时候,先要实例化这个类,生成一个对象。
问题:写一个类,过程中要调用到很多其它类,甚至这里的其它类,也要“依赖”于更多其它的类。手工实例化过于频繁,臃肿。
依赖注入,全称是“依赖注入到容器”, 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以“解析”出这个类的实例。
所以依赖注入就是把有依赖关系的类放入容器(IOC容器)中,然后解析出这个类的实例。
代码控制权从代码内部转到代码外部
在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
Angular 注入点只有一个,构造函数
好处:
当我们需要重用ProductComponent,而且还需要另一个productService类时
实例:
ng g component product1
ng g service shared/product
@Injetable()装饰器:把其他服务注入该服务中。将该服务是否能注入其他模块是根据其作用域判断的
提供器声明在模块中
绑定到模板
拥有相同的Token,但是拥有不同的类
提供器作用域:声明在组件中
ng g component product2
ng g service shared/anotherProduct
引入控制器:
绑定到模板
声明提供器,简单的new一下。
遇到问题:服务对象需要根据条件来决定具体实例化哪个对象,或者实例化对象,也就是调用构造函数时需要传递参数
工厂方法创建的对象是单例对象
问题:方法内部实例化方法,该方法和服务对象紧密的耦合在了一起
问题:用具体值,变量来实现其依赖注入
手工使用注入器(避免使用,错误风格)
允许将组件控制器的属性,方法与组件的模板连接起来
Ag4默认改为单向数据绑定。
Ag1使用双向(性能问题),在页面维护一个存有所有表达式的列表,事件发生,反复遍历列表,确认数据是否完全同步,耗性能
组件控制器的属性和方法与组件的模板连接
事件可以是函数调用,属性赋值,DOM事件,自定义事件
差值表达式相当于属性绑定
控制器:
private imgUrl:String="http://placehold.it/320x150";
模板:
<img [src]="imgUrl">
<img src="{{imgUrl}}"> 插值
event.target.value DOM属性
event.target.getAttribute(‘value’) HTML
DOM属性随着输入的改变而改变(指定当前值),HTML属性不变(指定初始值,初始化DOM值,任务完成)
还有一个,input的disabled的值的改变无法改变disabled的设置(true,false),但是DOM的设置是有效的
"unchanging" (input)="doOnInput($event)"
当没有DOM属性绑定时,就使用html属性绑定,比如td
主要使用表单from在
{(ngModel)} = ""
{{birthday | date:'yyyy-MM-dd HH:mm:ss' | }}
{{name | number:'2.1-4' | }}
整数几位+小数最少几位+小数最多几位
{{name | async}} 流
ng g pipe pipe/multiple
{{size | multiple}}
红色方法调用一次,绿色方法调用多次.共九个方法
接口对JS或者TS开发者可选,最好添加,优点:IDE的支持和强类型的检查
纯html表单:显示表单项,校验用户输入(required,pattern 验证消息过于模糊,消失时间过快,样式不能修改),提交表单数据(较好的应该是提交数据之前,调用数据处理方法,校验数据合法性,而且还能指定数据提交方法(异步,wobsocket,http)),不能满足特定需求,不够灵活。
npm init -y 引入带有默认配置的package。j'son
npm i @types/node -save
构建
ng build -> dist
部署
添加新的部署策略 如图 Ha'shLocationStrategy 解决构建后无法跳转路由的问题 url中出现了一个#号
ng serve ng build + 环境参数
启动参数添加 --env=prod 生产环境 环境文件里面可以生成任意的文件属性,可以去引用