jquery: npm install @types/jquery --save-dev
bootstrap: npm install @types/bootstrap --save-dev
主路由在跳路由时,路径是直接写的<a [routerLink]="['/product']">详情</a>
如果是子路由在同级之间跳转,路径是以./开头的,比如product下面有create和list,路径不用写product/list,而是./list<a [routerLink]="['./list']">详情</a>
路由的五个对象
routes : 保存路由配置信息,就是angularJs里面的router文件RouterOutlet: 在html中标记路由内容呈现位置的占位符,就是标记路由控制的范围标记Router: 跳转路由链接用的,在controller里面用RouterLink: 跳转路由连接用和Router一个作用,区别是在html中的a标签上使用ActivatedRoute: 路由跳转时,从一个路由到另一个路由跳转时,保存的路由的参数信息和angularJs的$stateParams类似;这里面的路由,配置的是路径和组件的对应关系,而不是和模块的对应 path:"user" (path不能以/开头) 如果path: "**",通配符匹配,必须放在最后面 compoent:"A"
<a [routerLink]="['/']">主页</a> <a [routerLink]="['/product']">详情</a> <router-outlet></router-outlet> [routerLink] 的[]表示属性绑定 <button (click)="handler()"><button>事件绑定在 app.components.ts文件中的组件类函数中添加
constructor(private router: Router) {}//导入router对象 handler(){ this.router.navigate(["/product"]) } //设置handler函数,路由跳转/product?id=1&name=2 => ActivatedRoute.queryParams[id]
<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"]; 在路由配置中传递数据 {path: /product, component: ProductComponent, data:[{isProd: true}]} => ActivatedRoute.data[0][isProd]在shared文件夹中创建一个product的服务;
声明提供器 在主模块中声明. 在app.modules.ts文件的主模块装饰器中. 所有的组件都可用.最常用. @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(); } } 在服务中的装饰器@injectable()表示可以再注入其他的服务;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) {} } //单项绑定,从模板到控制器在标签中用[(ngModel)],在组件类中直接定义:name: string;不在contructor中,也不在哪个钩子中;
在装饰器中导入FormsModule
@NgModule({ imports: [ FormsModule, HttpModule, ... ] })模板式表单只能用指令来定义数据模型,以下三个指令都来自FormsModule
NgForm : 代表整个表单,自动的添加到form标签上。跟angular1一样; 可以加在div上 与form标签功能相同. 如果不想要angular接管form标签可以加一个ngNoForm.NgModel : 双向数据绑定,标记一个标签成为数据模型的一部分NgModelGroup在input标签中添加ngModel和name属性,把该标签的数据添加到表单数据模型中 用#isHost="ngModel" 把标签的值暴露给页面模板,如果没有这个属性就没办法在html页面上用{{isHost}}显示出来;
在装饰器中导入ReactiveFormsModule
@NgModule({ imports: [ ReactiveFormsModule, HttpModule, ... ] })创建响应式表单需要两步
创建一个数据模型在模板上链接这个数据模型;数据模型由FormControl, FormGroup,FormArray这三个类型组成;
FromControl,对应指令FormGroup,FromGroupName 代表一个表单元素的值和状态 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"), ]) } FormGroup,对应的指令 formControl, formControlName 代表多个表单(FormControl)的集合,或整个表单;FormArray 对应的指令: formArrayName; 代表一个可以增长的表单集合;只能通过序号来访问;使用的指令与模板式表单不同 formGroupName,FormControlName,formArrayName,都是通过表单的name属性来链接的;响应式表单不能用"isHost"="ngModel"的方式在页面模板上使用,只能在代码中操作, 而模板式表单只能再页面模板上使用不能在代码中操作;创建一个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>组件中的OnChanges函数,能监控自身组件的值的变化,也能监控父组件传入的值的变化。 要被OnChanges函数监控,要满足下列条件
首先要在本身组件类函数中定义了变量;由于某种方式发生了改变,或者有父组件传入,或者是再本组件中有input标签和双向数据绑定;变量的值类型是简单数据类型,如果是复杂数据类型,比如对象。那么对象属性的改变了,这个变量本身的数据指向并没有发生改变。所以不会被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" } } }转载于:https://www.cnblogs.com/bridge7839/p/7484466.html
相关资源:Angular 4.0从入门到实战 打造股票管理网站-百度云