nvm install stable #安装最新版node nvm install 8.4.0 # 安装8.4.0版本的node nvm ls #列出可以使用的node nvm use 8.4.0 #使用8.4.0版本的node;
npm configset registry https://registry.npm.taobao.org
npm install -g typescript typings
npm install -g angular-cli@latest //若是用bash安装失败的话,能够在桌面使用命令行工具cmd,来安装
ng new angulardemo
npm run start
npm install -g angular-cli/@1.0.0
https://www.angular.cn/
jquery: npm install @types/jquery --save-devcss
bootstrap: npm install @types/bootstrap --save-devhtml
{ path : "home", component: HomeComponent, children: [ {path: "list", component: HomeList}, {path: "create", component: HomeCreate}, ] }
主路由在跳路由时,路径是直接写的<a [routerLink]="['/product']">详情</a>
node
若是是子路由在同级之间跳转,路径是以./开头的,好比product下面有create和list,路径不用写product/list,而是./list
<a [routerLink]="['./list']">详情</a>
jquery
路由的五个对象typescript
这里面的路由,配置的是路径和组件的对应关系,而不是和模块的对应
path:"user" (path不能以/开头) 若是path: "**",通配符匹配,必须放在最后面
compoent:"A"npm
<a [routerLink]="['/']">主页</a> <a [routerLink]="['/product']">详情</a> <router-outlet></router-outlet> [routerLink] 的[]表示属性绑定 <button (click)="handler()"><button>事件绑定
在 app.components.ts文件中的组件类函数中添加json
constructor(private router: Router) {}//导入router对象 handler(){ this.router.navigate(["/product"]) } //设置handler函数,路由跳转
/product?id=1&name=2 => ActivatedRoute.queryParams[id]bootstrap
<a [routerLink] = "['/product']" [queryParams]="{id: 1}"></a> export class ProductComponent implements Oninit { private productId: number; construct (private routeInfo: ActivatedRoute){} ngOnInit(){ this.productId = this.routeInfo.snapshot.queryParams["id"]; } }
{path: /product/:id} => /product/1 => ActivatedRoute.params[id]数组
<a [routerLink] = "['/product', 1]"></a> this.id = this.routeInfo.params["_value"]["id"];
//在组件类中的构造函数中,注入服务; constructor(private productService: ProductService){}
//在 providers: [{provide: ProductService, useClass: ProductService}] // 能够简写成 providers: [ProductService] //useClass实例化方式,new谁. provide是token,就是在构造函数中声明的ProductService1;
ng g service shared/product
在shared文件夹中建立一个product的服务;bash
@ngModule({providers:[productService]})
@Component({providers: [{provide: ProductService, useClass: AnotherProductService}]})
export class productComponent implements Oninit{ product: product; //声明变量 //在构造函数中注入服务 constructor(private productService: productService){} ngOnInit(){ this.product = this.productService.getProduct(); } }
angular4的属性绑定
<img [src]="imgUrl">
用[]把src属性包起来,[src]就是angular4的属性绑定,能够直接使用在此组件中定义的imgUrl的值;
css类属性绑定
<span *ngFor="let star of stars" class="btn" [class.primite] = "star">
[class.promite] = "star"是说span标签有没有css类promite,取决于star是否是true。和ng-class相似;
用[]把组件中的数据,绑定到模板上
export class BindComponent implements OnInit{ name: string; //值 constructor(){} ngOnInit() } <input [value]="name"> //从组件到模板
用()把组件中的事件绑定到组件中的方法中
<input (input)="doOnInput($event)"> export class BindComponent implements OnInit{ constructor(){} ngOnInit() doOnInput(event) {} } //单项绑定,从模板到控制器
<input [(ngModel)]="name"> export class BindComponent implements OnInit{ name: string; constructor(){} ngOnInit() doOnInput(event) {} }
在标签中用[(ngModel)],在组件类中直接定义:name: string;不在contructor中,也不在哪一个钩子中;
在装饰器中导入FormsModule
@NgModule({ imports: [ FormsModule, HttpModule, ... ] })
模板式表单只能用指令来定义数据模型,如下三个指令都来自FormsModule
<input type="checkbox" ngModel #isHost="ngModel" name="isHost"> {{isHost.value}} <div class="form-group" *ngIf="isHost.value"> </div>
在input标签中添加ngModel和name属性,把该标签的数据添加到表单数据模型中
用#isHost="ngModel" 把标签的值暴露给页面模板,若是没有这个属性就没办法在html页面上用{{isHost}}显示出来;
在装饰器中导入ReactiveFormsModule
@NgModule({ imports: [ ReactiveFormsModule, HttpModule, ... ] })
建立响应式表单须要两步
数据模型由FormControl, FormGroup,FormArray这三个类型组成;
export class CdAppPublishComponent implements OnInit { username: FormControl = new FormControl("aaa") //新建一个表单元素,初始值为"aaa" formModel: FormGroup = new FormGroup({ //新建一个FormGroup form: new FromControl(), to: new FromControl(), }) emails: FormArray = new FormArray([ new FormControl("a@a.com"), ]) }
ng g component navbar
建立一个navbar导航组件;会在app文件夹中直接建立一个navbar文件夹,里面是相应的文件;
建立后会自动注入到appModules父组件中
把父组件中的数据传递给子组件;
<app-stars [rating] = "product.rating">
app-stars这个组件的rating属性是由父组件的product.rating传递来的
在app-stars组件的构造函数的钩子OnInit中设置
@Input
private rating: number = 0;
rating变量是number类型,初始化值是0,私有数据,
由父组件传入(@Input输入装饰器);
也就是说装饰器是直接写在一个变量,构造函数的上面起做用的
输入属性是指被input装饰器注解的属性;用来从父组件接受数据.属性绑定是单向的,从父组件到子组件
在子组件中
// import { Component,ngOnInit, Input } from "@angular/forms"; //引入Input装饰器,没错装饰器也须要引入; export class OrderComponent implements OnInit{ //用输入装饰器修饰这两个变量,表示这两个值是从父组件传入的; @Input() storkCode: string; @Input() amount: number; constructor(){}; ngOnInit(){} }
<div>买{{amount}}个 {{storkCode}}</div>
在父组件中
export class AppComponent { stock = ""; }
<div>我是父组件</div> <input type="text" placeholder= "请输入股票代码" [(ngModel)]= "stock" > <app-order [stockCode]="stock" [amount]="100"></app-order>
@Input() storkCode: string;
constructor(routeInfo: ActivatedRoute) { } ngOnInit(){ this.productId = this.routeInfo.snapshot.queryParams["id"]; }
//js运行环境,引入要使用的组件(Component),钩子(ngOnInit),装饰器(Input) import { Component,ngOnInit, Input } from "@angular/forms"; /* 1. export导出,使外部可使用这个对象 2. class表示这是一个对象的类,里面的属性(好比title)都是this.title. 里面的函数好比console(){console.log("123")}都是this.console; 而上面的this(实际上并不存在)指的是用这个组件类实例化出来的组件 3. 在export class OrderComponent implements OnInit{}是一个对象,不是函数。里面不能直接运行js. 要运行js的话应该在constructor(){console.log("这里面")}或者是ngOnInit(){}里面; */ export class OrderComponent implements OnInit{ //这里面定义的变量,函数,都是能够爆露在组件实例的模板上的值;constructor是构造函数。 //ngOnInit是当初始化是运行的函数钩子; //用输入装饰器修饰这两个变量,表示这两个值是从父组件传入的; @Input() storkCode: string; @Input() amount: number; constructor(){}; ngOnInit(){} }
组件中的OnChanges函数,能监控自身组件的值的变化,也能监控父组件传入的值的变化。
要被OnChanges函数监控,要知足下列条件
export class ChildComponent implements OnInit, OnChanges { greeting: string; user: {name: string}; constructor(){} //changes是ngOnChanges的参数,监控到的变化信息存储在里面。SimpleChanges是 //changes的数据类型; ngOnChanges(changes: SimpleChanges): void { console.log(changes); } //changes的数据模型以下所示 { "greeting": { "previousValue": {}, "currentValue": "Hello" } } }
ngDoCheck(): void { if(this.user.name !== this.oldUser.name) { console.log("改变了“) } }
message: string; ngAterViewInit(): void { setTimeout(() => { this.message = "hello"; }, 0) }
export class ChildComponent{ greeting(name: string) { console.log(name) } }
<app-child #child1></app-child> <app-child #child2></app-child>
export class ChildComponent{ @ViewChild("child1") child1: ChildComponent; ngOnInit(): void { this.child1.greeting("tom") } }
<div> 我是子组件 <ng-content select=".header"><ng-content> <ng-content select=".footer"><ng-content> </div>
<div> 我是父组件 <app-child> <div class="header">这是页头,这个div时父组件投影到子组件中的内容,title: {{title}}</div> <div class="footer">这是页脚,这个div时父组件投影到子组件中的内容</div> </app-child> </div> <div [innerHTML] = 'divContent'> </div>
export class AppComponent { title = "app works"; divContent = "<div>慕课网;</div>" }