從flask視角理解angular(二)Blueprint VS Component

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下的用 jinjapython

2 語法的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')

 

OnInit

不一樣於構造函數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文件中。

 

引用Componet視圖

父組件AppComponent會告訴子組件HeroDetailComponent要顯示哪一個英雄, 告訴的方法是把它的selectedHero屬性綁定到HeroDetailComponenthero屬性上。

這種綁定(協調主視圖AppComponent與HeroDetailComponent的方式)是這樣的:

<hero-detail [hero]="selectedHero"></hero-detail>

 

在等號的左邊,是方括號圍繞的hero屬性,這表示它是屬性綁定表達式的目標。 咱們要綁定到的目標屬性必須是一個輸入屬性,不然Angular會拒絕綁定,並拋出一個錯誤。

 

1 把AppComponentselectedHero屬性綁定到HeroDetailComponent的input 屬性hero上。表示了傳輸關係

2 <hero-detail>是HeroDetailComponent 的 @Component裏的selector。

 

這樣的好處是,不用在AppComponent裏顯示引用HeroDetailComponent。只要[hero]是declaration過的某個Component裏的input屬性就OK了。

 

——這個比較彆扭但又很巧妙。

相關文章
相關標籤/搜索