1. 程式人生 > >angular4 結構型指令 屬性型指令總結

angular4 結構型指令 屬性型指令總結

屬性型指令總結             看了幾次官網的屬性指令文件,對一些關鍵的東西還是很混淆,學到的都是基於表面的使用,這裡是我把一些重要的東西給總結起來,方便自己看:            1.三種指令:元件 、結構型指令(ngif  ngfor等)和屬性型指令 (所有元件都為指令)            結構型指令 —   通過新增和移除 DOM 元素改變 DOM 佈局的指令
           屬性型指令 —   改變元素、元件或其它指令的外觀和行為的指令。
       2.angular在標籤元素上發現我們自定義的屬性,先考慮是否為指令,如果為就例項化這個指令類,這就意味著我們在模板中引入這個指令,不用像服務一樣在建構函式裡聲明瞭,按我理解 元件 指令 管道 是處於同一等級的,這樣就不存在誰引入誰,直接拿來用就是了。          3.使用資料綁定向指令傳遞值        使用@input 向指令傳遞值,            <p appHightlight highlightColor="yellow"
>Highlighted in yellow</p>
           <p appHightlight [highlightColor]="'orange'">Highlighted in orange</p>         注意這二者的區別@input向指令輸入值的方式不同,多了個[ ]時orange也多了個‘ ’,因為不加orange會當成一個類的屬性         4.繫結到第二個屬性           可以直接寫在宿主裡<p [appHighlight]="color"defaultColor="violet">不過也需要通過@input來接值
        5.這個是要注意的為什麼要加@Input?            @Input裝飾器都告訴Angular,該屬性是公共的,並且能被父元件繫結。 如果沒有@Input,Angular就會拒絕繫結到該屬性。
但我們以前也曾經把模板HTML繫結到元件的屬性,而且從來沒有用過@Input。 差異何在?

差異在於信任度不同。 Angular把元件的模板看做從屬於該元件的。 元件和它的模板預設會相互信任。 這也就是意味著,元件自己的模板可以繫結到元件的任意屬性,無論是否使用了@Input裝飾器。

但元件或指令不應該盲目的信任其它元件或指令。 因此元件或指令的屬性預設是不能被繫結的
。 從Angular繫結機制的角度來看,它們是私有的,而當添加了@Input時,它們變成了公共的 只有這樣,它們才能被其它元件或屬性繫結。

你可以根據屬性名在繫結中出現的位置來判定是否要加@Input。
當它出現在等號右側的模板表示式中時,它屬於模板所在的元件,不需要@Input裝飾器。(資料來源)
當它出現在等號左邊的方括號([ ])中時,該屬性屬於其它元件或指令,它必須帶有@Input 裝飾器。(因為angular操作的是dom的property 不是attribute 對不存在的dom屬性就不信任,所以有的不需要@input)
試用此原理分析下列範例:
src/app/app.component.html (color)
 content_copy
<p [appHighlight]="color">Highlight me!</p>
color屬性位於右側的繫結表示式中,它屬於模板所在的元件。 該模板和元件相互信任。因此color不需要@Input裝飾器。
myHighlight屬性位於左側,它引用了MyHighlightDirective中一個帶別名的屬性,它不是模板所屬元件的一部分,因此存在信任問題。 所以,該屬性必須帶@Input裝飾器。
   二 結構型指令     結構型指令的職責是HTML佈局。 它們塑造或重塑DOM的結構,比如新增、移除或維護這些元素。Angular會解開這個*語法糖,變成一個<ng-template>標記,包裹著宿主元素及其子元素     1.NgIf 大駝峰為類,小駝峰為它的屬性。 當我們隱藏掉一個元素時,元件的行為還在繼續 —— 它仍然附加在它所屬的DOM元素上, 它也仍在監聽事件。Angular會繼續檢查哪些能影響資料繫結的變更。 元件原本要做的那些事情仍在繼續。
雖然不可見,元件及其各級子元件仍然佔用著資源,而這些資源如果分配給別人可能會更有用。 在效能和記憶體方面的負擔相當可觀,響應度會降低,當然,從積極的一面看,重新顯示這個元素會非常快。 元件以前的狀態被保留著,並隨時可以顯示。 元件不用重新初始化 —— 該操作可能會比較昂貴。 這時候隱藏和顯示就成了正確的選擇。
但是,除非有非常強烈的理由來保留它們,否則我們更傾向於移除使用者看不見的那些DOM元素,並且使用NgIf這樣的結構型指令來收回用不到的資源。           *ngIf指令被移到了<ng-template>元素上。在那裡它變成了一個屬性繫結[ngIf]。
        <div>上的其餘部分,包括它的class屬性在內,移到了內部的<ng-template>元素上。(只會顯示最終的結果)      2、ngfor          <div *ngFor="let hero of heroes; let i=index; let odd=odd; trackBy: trackById" [class.odd]="odd"> ({{i}}) {{hero.name}}</div>(三種用法)
    <ng-template ngFor let-hero [ngForOf]="heroes" let-i="index" let-odd="odd" [ngForTrackBy]="trackById"><div [class.odd]="odd">({{i}}) {{hero.name}}</div></ng-template>     3.ngswitch 為屬性型指令  ngswitchcase 為結構型指令  三 自定義結構型指令 ng-template     優先使用星號(*)語法
 星號(*)語法比不帶語法糖的形式更加清晰。 如果找不到單一的元素來應用該指令,可以使用<ng-container>作為該指令的容器。
 雖然很少有理由在模板中使用結構型指令的屬性形式和元素形式,但這些幕後知識仍然是很重要的,即:Angular會建立<ng-template>,還要了解它的工作原理。 當需要寫自 己的結構型指令時,我們就要使用<ng-template>,<ng-template>是一個 Angular 元素,用來渲染HTML。 它永遠不會直接顯示出來。 事實上,在渲染檢視之前,Angular 會把<ng-template>及其內容替換為一個註釋。自己寫一些標籤在ng-template時,不顯示當成註釋     四、<ng-container> 的救贖 另一個問題是:有些HTML元素需要所有的直屬下級都具有特定的型別。 比如,<select>元素要求直屬下級必須為<option>,那麼我們就沒辦法把這些選項包裝進<div>或<span>中。  <span *ngFor="let h of heroes">
      <span *ngIf="showSad || h.emotion !== 'sad'">
      <option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
      </span>
option為空結構指令的錯亂
      Angular的<ng-container>是一個分組元素,但它不會汙染樣式或元素佈局,因為 Angular 壓根不會把它放進 DOM 中。       <ng-container *ngIf="hero">
    <option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
     </ng-container>解決一些標籤不顯示的問題 (select option)          雜項:       1. ElementRef是一個服務,它賦予我們通過它的nativeElement屬性直接訪問 DOM 元素的能力。 Renderer服務允許通過程式碼設定元素的樣式       [email protected]裝飾器引用屬性型指令的宿主元素 相當於addEventListene            當然,你可以通過標準的JavaScript方式手動給宿主 DOM 元素附加一個事件監聽器。 但這種方法至少有三個問題:            必須正確的書寫事件監聽器。當指令被銷燬的時候,            必須拆卸事件監聽器,否則會導致記憶體洩露。             必須直接和 DOM API 打交道,應該避免這樣做。     [email protected]取別名@Input('appHighlight') highlightColor: string;     4. 每個宿主元素上只能有一個結構型指令,  有一個簡單的解決方案:把*ngIf放在一個"容器"元素上,再包裝進 *ngFor 元素。 這個元素可以使用ng-container,以免引入一個新的HTML層級    5.使用TemplateRef取得<ng-template>的內容,並通過ViewContainerRef來訪問這個檢視容器。  總結: 結構型指令可以操縱 HTML 的元素佈局。
當沒有合適的容器元素時,可以使用<ng-container>對元素進行分組。
Angular 會把星號(*)語法解開成<ng-template>。
內建指令NgIf、NgFor和NgSwitch的工作原理。
微語法如何展開成<ng-template>。
寫了一個自定義結構型指令 —— UnlessDirective。 angular預設是單資料繫結   angularjs預設是雙資料繫結  。 屬性指令意味著標籤的左右都為元件的屬性 。

相關推薦

angular4 結構指令 屬性指令總結

屬性型指令總結             看了幾次官網的屬性指令文件,對一些關鍵的東西還是很混淆,學到的都是基於表面的使用,這裡是我把一些重要的東西給總結起來,方便自己看:            1.三種指令:元件 、結構型指令(ngif  ngfor等)和屬性型指令 (所

Angular 指令(Directive)屬性指令

Angular 指令(Directive)屬性型指令 在Angular中有三種指令型別 元件 :擁有模板的指令 結構型指令:通過新增或移除DOM來改變DOM佈局的指令 屬性型指令:改變元素,元件或其他指令的外觀和行為的指令 自

Angular 屬性指令 directive

1.使用命令建立指令    ng  g  d  yourDirectiveName 2.yourDirectiveName.directive.ts程式碼: import {Directive,ElementRef,HostListener,Input} from '@an

angular 建立一個簡單的屬性指令 (動態獲取DOM元素size,對DOM樣式進行改變)

一. 在 Angular 中有三種類型的指令:1. 元件 — 擁有模板的指令2. 結構型指令 — 通過新增和移除 DOM 元素改變 DOM 佈局的指令3. 屬性型指令 — 改變元素、元件或其它指令的外觀和行為的指令。本章主要想介紹一下屬性型指令並建立一個簡單的屬性型指令,屬性

Angular2 之 屬性指令

入手方式: 需求 – 先要弄清楚我們做什麼? 被使用方式 – 長什麼樣子?什麼場景被使用?怎麼被使用? 將每個特性寫成單元測試,然後寫程式碼,將這個單元的程式碼測試通過後,再進行下一個特性程式碼的單

膝上電腦通過DOS指令開啟無線WiFi

具體步驟如下 首先,進入cmd指令模式。同時按住win鍵加R鍵,接著輸入cmd回車出現如圖所示的黑視窗 接著,我們需要了解幾段cmd指令 netsh wlan set hostednetwor

java中的數據類和運算符的總結歸類。

等等 宋體 表示 參數 強制轉換 賦值運算 對象 強制 特點 首先學習java肯定先要了解java的發展史,以及java的特點,常見的dos命令,jdk的安裝,如何開發java程序等等一下概念行的東西,這裏面我都不一一說了。 今天這一章主要想總結一下java中的數據類型和運

Angular2-無法給元素的屬性做雙向綁定,除非這個屬性指令或者組件

lec input bsp 操作 data hang 前綴 綁定 對象   呈現一個實體對象的DOM結構,這個DOM有個自定義屬性是需要動態賦值的,比如說 item.data 要綁到自定義屬性 data 上;你可能會這麽寫: data="{{item.data}}" ,但直

Linux 程序設計學習筆記----Linux下文件類屬性管理

腳本 types.h 沒有 oot 創建 jsb 文件 屬性 文件大小 轉載請註明出處:http://blog.csdn.net/suool/article/details/38318225 部分內容整理自網絡,在此感謝各位大神。 Linux文件類型和權限 數據表示

spring各種類屬性註入

spring bean 多種類型屬性註入spring test + Junit方式:pox.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

上傳文件結構體及類對照

-a tex rdp process 結構體 for excel表 .sh XML { "data": { "file": { "name": "1.xlsx", "type": "applicati

節點類屬性 記錄

.com alt .cn es2017 記錄 分享 屬性 blog 技術 節點類型及屬性 記錄

字符串類內建方法歸納總結

內建函數版本:python3.6在查看bulitins的內建函數時,對字符串的內建方法進行了分類總結。類別 方法描述示例查找string.find(sub, start=None, end=None)在指定的範圍內查找子串,找到則返回最小的index;未找到則返回-1mystr = ‘hello world

java遍歷實體類的屬性和數據類以及屬性

取值 .get 數組 所有 system blog ++ 實體bean lds 遍歷實體類的樹形和數據類型一級屬性值 /** * 遍歷實體類的屬性和數據類型以及屬性值 * @param model * @throws NoSuchMe

系統目錄結構 文件類和ls、alias命令

linux5.1 系統目錄結構/bin 該目錄為軟鏈接,用戶二進制文件,包含二進制可執行文件,同/sbin、/usr/bin/、/usr/sbin/、/sbin一樣都是存放的常用命令/boot linux的引導加載程序文件,啟動相關的文件,grub相關的文件/dev 系統所有的設備及驅動文件/etc 配置文件

201671010139 徐楠 關於泛程序設計的部分總結

未使用 提高 之前 spa () 錯誤 類型 容器 提取 泛型,簡單的說,就是指參數化類型的能力,在未使用泛型之前,如ArrayList類,其中可以存放任意類型的對象,其方法大部分的參數類型都是Object類型,而實際中,我們常常僅需要存儲一種類類型,如String類型,以

C++標準庫vector類的使用和操作總結

種類 style 開始 spa log string string類 gpo targe   vector是一種類型對象的集合,它是一種順序容器,容器中的所有對象必須都是同一種類型。vector的對象是可以動態生長的,這說明它在初始化時可以不用指定大小,而是再使用時根據元素

spring註入對象類屬性

ops 16px dao beans oot 英語 value 類屬性 color 一.1.創建service類和Dao類 (1)在service中得到dao對象 2.具體實現過程 (1)在service裏邊把dao作為類型屬性 (2)生成dao類型屬性的set方法 pu

python沈澱之路~~整屬性

tuple 結果 color 用法 知識 進制 轉換成整型 16進制 length python的基礎知識: 基本數據類型:int str list tuple dict bool 一、整型的屬性功能 1、工廠方法將字符串轉換成整型 1 a = "12

Hibernate 映射枚舉(Enum) 類屬性

Hibernate在數據庫中我們一般用整數或字符串來表示枚舉值(有些數據庫(如 MySQL)本身帶有枚舉類型), 而在使用 Hibernate 時實體對象中也用 Integer 或 String 來表示枚舉就不那麽友好了。試想來我們這樣定義實體對象的兩個屬性@Entitypublic class User {