1. 程式人生 > >Angular4學習筆記(六):解耦

Angular4學習筆記(六):解耦

程式碼已提交至GitHub
就目前為止,demo的結構已經被拆的很細很細。元件、服務、model之間已經分割開來,下一步的目標就是把介面做的好看一點。

目前介面看上去還是太簡單,在這個看臉的世界裡,完全活不下去。
太簡單了!

至少做成這個樣子:

這裡寫圖片描述

在這之前,還可以做一些細微的拆分。

分離V和C

這是目前的主頁元件gundam-host.component.ts,通過註解Component裡的template匯出的的GundamHostComponent共同組成了MVC裡的V和C。
這裡寫圖片描述

在目前的寫法裡是沒問題的,因為介面比較簡單。

但是如果介面很複雜,VC擠在一起就又會變的很臃腫。所以在調整介面之前,先把V和C分開。

註解@Component裡除了提供了template屬性外,還提供了temlateUrl屬性。前者通過`(反單引號)包裹html程式碼來標示View,後者直接將指向的html檔案匯入進來成為View。

修改主頁元件步驟

  1. 在host包下,新建html資料夾,資料夾內新建gundam-host.component.html檔案。
    這裡寫圖片描述
  2. 將gundam-host.component.ts中component屬性裡的html程式碼整個剪下進來。
    這裡寫圖片描述
  3. 修改template屬性為templateUrl,使其指向剛才新建的檔案:
@Component({
  templateUrl: './html/gundam-host.component.html'
, })

同理,分離detail頁面和app.component.ts元件。
這裡寫圖片描述

這裡寫圖片描述

把V和C徹底的分離,以後在V上搞事情就方便多了。

元件巢狀

gundam-host.component.html檔案中的程式碼,看起來有點不妥。雖然就目前而言只是簡單的用一個div包裹了span標籤進行資料展示,但是保不齊就span標籤就會被其他複雜的介面所替代。而主頁本身如果再複雜化(事實上 後期確實變的更復雜了),那麼頁面還是會變的臃腫不堪。

安全起見,先趁著介面簡單的時候把功能單一重複的介面抽提出來,形成另一個元件。這樣host元件最終會被拆分為大大小小的元件,而每一個元件之間相互獨立,以打倒更大程度上的解耦。

angular有自己的一套方法,來解決元件巢狀元件和元件抽提的問題。

這個方法就是Compoent註解中的selector屬性。

其實有關selector,在app.component.ts裡也是有的。

這裡寫圖片描述

通過在app.component.ts裡宣告selector屬性,在public/index.html裡進行使用,把整個angular的介面給裝了進去。

這裡寫圖片描述

所以現在覺得angular真的好省心啊,給了一堆積木想怎麼拼就怎麼拼。

下面開始抽提主頁中的列表項,使其成為一個獨立的元件。

新建host-item資料夾,在其下新建gundam-host-item.component.ts檔案,用單獨的html檔案和templateUrl屬性進行VC分離。

import { Component } from '@angular/core';

@Component({
    templateUrl: './html/gundam-host-item.component.html'
})

export class GundamHostItemComponent {

}

將原本gundam-host-item.component.ts中的html程式碼塊複製到gundam-host-item.component.html中去。

新建的類需要在在app.module.ts檔案裡註冊才能使用。(說起來angular也是Googler寫的,我說寫起來怎麼和Android的節奏那麼像似….)

這裡寫圖片描述

修改gundam-host-item.component.ts中的@Component,增加selector屬性,屬性值設定為my-host-item

@Component({
    selector: 'my-host-item',
    templateUrl: './html/gundam-host-item.component.html'
})

在html中用

<my-host-item></my-host-item>

代替

    <div *ngFor="let gundam of gundams"  [routerLink]="['/detail', gundam.id]">
      <span>
        {{gundam.name}}
      </span>
    </div>

但是是這樣又帶來一個問題,如何把資料傳進去呢?

還是繫結

angular資料倒來倒去,都是通過繫結的方式。既然host-item裡沒有值,那就傳一個進去。

<my-host-item *ngFor="let gundam of gundams"  [routerLink]="['/detail', gundam.id]" [gundam]="gundam"></my-host-item>

[gundam]=”gundam”即是繫結宣告,宣告該元件中有一個名為gundam的屬性,然後將拆解gundams陣列得到的gundam作為值傳遞給my-host-item中的gundam屬性。

現在值已經從頁面裡傳進去了,但是在元件中還是要接收一下,否則會報錯。

具體來說,要把外界的值傳遞給Controller。

gundam-host-item.component.ts中的inport裡增加input 類,用來進行資料的接收。

import { Component, Input } from '@angular/core';
定義一個Gundam類的gundam屬性(定義之前先匯入gundam類),表示用此屬性接收傳遞進來的值(與之前[gundam]=對應)。
gundam: Gundam;

定義完畢後,在旁邊增加上@input的註解。

import { Component, Input } from '@angular/core';
import { Gundam } from './../../model/gundam';

@Component({
    selector: 'my-host-item',
    templateUrl: './html/gundam-host-item.component.html'
})

export class GundamHostItemComponent {
    @Input() gundam: Gundam;
}

再進入item的html頁面,刪去多餘*ngfor

<div>
  <span>
    {{gundam.name}}
  </span>
</div>

重新整理頁面,可以正常顯示咯。

這裡寫圖片描述

又是一頓神拆,先把v和c分離,又進一步把主頁拆成2個元件。這樣就不怕產品經理跳出來說,“我覺得這個主頁的item需要換一下了。”~(當然,其實拿把菜刀放在旁邊是更好的選擇)~

現在,可以使用bootstrap了。

相關推薦

Angular4學習筆記

程式碼已提交至GitHub 就目前為止,demo的結構已經被拆的很細很細。元件、服務、model之間已經分割開來,下一步的目標就是把介面做的好看一點。 目前介面看上去還是太簡單,在這個看臉的世界裡,完全活不下去。 至少做成這個樣子: 在這之前,還

各種音視訊編解碼學習之 編解碼學習筆記H.26x系列

    最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解成很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyofbitbi

Unity3D之Mecanim動畫系統學習筆記使用腳本控制動畫

ont nim 復制代碼 info rip esc enter machine images 控制人物動畫播放 這裏我重新弄了一個簡單的場景和新的Animator Controller來作為示例。 下面先看看Animator Controller的配置: 人物在站

.net core 2.0學習筆記Remoting核心類庫RealProxy遷移

ride dispatch 包含 void reflect 既然 splay creat (六) 在學習.net core的過程中,我們已經明確被告知,Remoting將不會被支持。官方的解釋是,.net framework 類型包含了太多的Runtime的內容,是

java學習筆記變量類型

animal 單獨使用 div 位置 fin strong pub 局部變量 變量聲明 java一共三種變量: 局部變量(本地變量):方法調用時創建,方法結束時銷毀 實例變量(全局變量):類創建時創建,類銷毀時銷毀 類變量(靜態變量):程序啟動是創建,程序銷毀時銷毀

javaweb學習筆記HTML

目錄 1.HTML相關概念 2.主要標籤 2.1頭資訊 2.2文字標籤 2.3字元實體 2.4媒體標籤 2.5連結標籤 2.6影象標籤   2.7表格標籤 2.8框架標籤 2.9表單標籤 1.HTML相關概念 軟體的結構:

學習筆記使用隨機森林演算法檢測FTP暴力破解

1.資料蒐集:         載入ADFA-LD中正常資料         定義遍歷目錄下檔案         從攻擊資料中篩選出和FTP暴力破解有關的資料 &n

機器學習筆記KNN分類器

1 KNN演算法 1.1 KNN演算法簡介 KNN(K-Nearest Neighbor)工作原理:存在一個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類對應的關係。輸入沒有標籤的資料後,將新資料中的每個特徵與樣本集中資料對應的特

Scala學習筆記本地函式、頭等函式、佔位符和部分應用函式

本地函式 可以在方法內定義方法,這種方法叫本地函式,本地函式可以直接訪問父函式的引數 def parent(x: Int, y: Int): Unit ={ def child(y:Int) = y + 1 val z = child(y) println(s"x: $x, z

圖解演算法學習筆記廣度優先搜尋

本章內容;        學習使用新的資料結構圖來建立網路模型;        學習廣度優先搜尋;        學習有向圖和無向圖;        學習拓撲排序,這種排序演算法指出了節點之間的依賴關係。 1)圖簡介 假設你住在舊金山,要從雙子峰前往金門大橋。你想乘

機器學習筆記貝葉斯分類器

機器學習所研究的主要內容,是關於在計算機上從資料中產生“模型”的演算法,這個產生的模型大體上可以分為“判別式模型”和“生成式模型”兩大類。 其中判別式模型是給定x,通過直接對條件概率分佈P(y|x)進行建模來預測y。這種方法尋找不同類別的最優分類面,反映的是異類資料之間的差異。之前幾篇文章中介紹

SpringBoot學習筆記SpringBoot實現Shiro登入控制和許可權控制

登入模組:在登入時必須呼叫 授權模組:不是一登入就調動,而是當角色許可權控制時才會呼叫 登入控制 環境搭建在上一篇。 資料庫表 表名:role 欄位:id rolename 表名:user 欄位:id username sex roleid 在程式碼中簡歷資料庫表對應的實

Python3《機器學習實戰》學習筆記Logistic迴歸基礎篇之梯度上升演算法

一 前言 本文從Logistic迴歸的原理開始講起,補充了書上省略的數學推導。本文可能會略顯枯燥,理論居多,Sklearn實戰內容會放在下一篇文章。自己慢慢推導完公式,還是蠻開心的一件事。 二 Logistic迴歸與梯度上升演算法 Logistic迴歸是眾

Angular4學習筆記http

程式猿十大未解之謎 其實我準備原本按照教程上的寫法,用angular-in-memory-web-api類偽裝一個伺服器。而在最開始的專案裡,我也確實是這麼做的。 但是後來我用webpack替換了原demo中的systemjs,一切都跑偏了。 同樣

Cesium學習筆記幾何和外觀(Geometry and Appearances)

我們先直接來看一個例子 var viewer = new Cesium.Viewer('cesiumContainer'); var flag = viewer.entities.add({ rectangle : { coord

Scala學習筆記物件

6.1單例物件 scala沒有靜態方法或靜態欄位,可以使用object這個語法來達到同樣的目的。物件定義了某個類的單個例項,包含了你想要的特性。 object Accounts{ private var lastNumber=0 def newUniqueNumber

pytorch學習筆記自定義Datasets

什麼是Datasets: 在輸入流水線中,我們看到準備資料的程式碼是這麼寫的data = datasets.CIFAR10("./data/", transform=transform, train=

mule studio學習筆記外部web service呼叫

1.eclipse中建立web Service        eclipse中配置axis2;       建立dynamic web service,Java Resource src中放置服務實現類,右擊,creat web service生成wsdl,右擊wsdl,p

flask學習筆記繼承模板和block的使用

繼承的作用就是為了少寫一些重複的程式碼,例如導航欄的實現就需要在模板中定義一個導航欄,其他頁面使用繼承即可: 新建一個base.html,而block main的部分就是導航欄下每個頁面不同的介面,由每個頁面負責實現。 剩下的index和login頁面通過對base的繼承

XML學習筆記Jaxb負責xml與javaBean對映

前言: 1、兩套標準:Jax-ws(web service)和 Jax-rs(restful)。 2、在JAVA EE 5\6中,jaxb可以很方便的與jax-rs、jax-ws整合,極大的簡化了web service介面的開發工作量。jaxb負責xml與javaBean的