Component相似flask app下面的每一個blueprint。css
import 'rxjs/add/operator/switchMap'; import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, ParamMap } from '@angular/router'; import { Location } from '@angular/common'; import { Hero } from './hero'; import { HeroService } from './hero.service'; @Component({ selector: 'hero-detail', templateUrl: './hero-detail.component.html', styleUrls: [ './hero-detail.component.css' ] }) export class HeroDetailComponent implements OnInit { hero: Hero; constructor( private heroService: HeroService, private route: ActivatedRoute, private location: Location ) {} ngOnInit(): void { this.route.paramMap .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id'))) .subscribe(hero => this.hero = hero); } goBack(): void { this.location.back(); } }
@Component 說明了兩個路徑,html
1 /templates/每一個blueprint下的用 jinjapython2 語法的XXX.html,2 /static/下的 cssnginx
也能夠直接把模板內容和css直接寫在@Component下面,這時Component有點相似Unity3d裏的gameobject,@Component裏面的「selector,template」 有點相似gameobject裏的「transfrom」,"material"。(U3d裏是gameobject->component 不要和ng的Component混了)。web
區別在於:flask強調"動靜分離"。這樣部署的時候,static部分用nginx, web api部分 用 gunicorn。flask
angular的「先後端」通通用ts/js搞了。這樣開發者不須要太在意「動靜」與「先後"的分野。封裝程度相似unity3d裏的prefab,感受很不錯。後端
每次開頭都要導入Componentapi
import { Component } from '@angular/core';
相似blueprint:app
from flask import Blueprint
導出ide
export class AppComponent {
title = 'Tour of Heroes'; hero = 'Windstorm'; }
相似
user_blueprint = Blueprint('user', __name__, url_prefix='/user')
不一樣於構造函數constructor。
import { OnInit } from '@angular/core'; export class AppComponent implements OnInit { ngOnInit(): void { } }
感受constructor相似於python的__new__() 而ngOnInit()相似於一般使用的__init__(
self
)
看介紹:
只要咱們實現了 Angular 的 ngOnInit 生命週期鉤子,Angular 就會主動調用這個鉤子。 Angular提供了一些接口,用來介入組件生命週期的幾個關鍵時間點:剛建立時、每次變化時,以及最終被銷燬時。
又有點像unity3d的Monobehaviour的 Awake() Start() Update()...由引擎在特定時機調用調用。
注意命名方法 HeroDetailComponent 大概相似於把藍圖對象命名爲HeroDetailBlueprint
文件名和組件名遵循風格指南中的標準方式。
組件的類名應該是大駝峯形式,而且以
Component
結尾。 所以英雄詳情組件的類名是HeroDetailComponent
。The component class name should be written in upper camel case and end in the word "Component". The hero detail component class is
HeroDetailComponent
.組件的文件名應該是小寫中線形式,每一個單詞之間用中線分隔,而且以
.component.ts
結尾。 所以HeroDetailComponent
類應該放在hero-detail.component.ts
文件中。
父組件AppComponent
會告訴子組件HeroDetailComponent
要顯示哪一個英雄, 告訴的方法是把它的selectedHero
屬性綁定到HeroDetailComponent
的hero
屬性上。
這種綁定(協調主視圖AppComponent與HeroDetailComponent的方式)是這樣的:
<hero-detail [hero]="selectedHero"></hero-detail>
在等號的左邊,是方括號圍繞的hero
屬性,這表示它是屬性綁定表達式的目標。 咱們要綁定到的目標屬性必須是一個輸入屬性,不然Angular會拒絕綁定,並拋出一個錯誤。
1 把
AppComponent
的selectedHero
屬性綁定到HeroDetailComponent
的input 屬性hero
上。表示了傳輸關係2 <hero-detail>是HeroDetailComponent 的 @Component裏的selector。
這樣的好處是,不用在AppComponent裏顯示引用HeroDetailComponent。只要[hero]是declaration過的某個Component裏的input屬性就OK了。
——這個比較彆扭但又很巧妙。