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。
修改主頁元件步驟:
- 在host包下,新建html資料夾,資料夾內新建gundam-host.component.html檔案。
- 將gundam-host.component.ts中component屬性裡的html程式碼整個剪下進來。
- 修改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的