1. 程式人生 > >Angular2-自定義指令@Directive

Angular2-自定義指令@Directive

我們按照下面的步驟一步一步帶著思考去學習,相信很容易就能掌握Angular自定義指令,廢話不多少,開始學習,你準備好來嗎?

概述

所謂指令就是用於改變一個DOM元素的外觀或行為,Angular2為我們封裝了很多的內建指令,專案中也無時無刻不在使用指令,Angular2中有三類指令

(1).結構型指
通過新增和移除 DOM 元素改變 DOM 佈局的指令,例如:Ngif和Ngfor
(2).屬性型指令
改變元素、元件或其它指令的外觀和行為的指令,例如:NgClass
(3).元件
元件是一個模板指令,相信大家都很熟悉

今天我們來講講自定義指令,通過一個案例來學習自定義屬性指令,需求是:在輸入框輸入值時,如果值中包含空格,我們把空客去掉,最終的效果是這樣的


第一步、建立自定義指令

import {Directive, ElementRef, HostListener}
from "@angular/core";

@Directive({
 selector: '[input-trim]'
})
export class InputTrimDirective {
 constructor(public elementRef: ElementRef) {
 }
 @HostListener('keyup', ['$event.target'])
 keyupFun(evt) {
   if (evt.value) {
     this.elementRef.nativeElement

.value = evt.value.trim();
   
}
 }
}

我們通過import從core庫中匯入Directive,HostListener,ElementRef的引入,下面我們分別來看看的作用。
Directive
用於@Directive裝飾器功能,用於定義這個class是一個指令,通過@Directive修飾這樣就擁有了指令的功能,我們在元組中宣告selector屬性值為[input-trim],方括號的寫法表示是一個屬性指令 還有以下幾種寫法:

 element-name: 使用元素名稱選擇
 .class:                使用類名選擇
 [attribute]

:         使用屬性選擇
 [attribute=value]:使用屬性和值選擇
 :not(sub_selector):只有當元素與sub_selector不匹配時才選擇
 selector1,selector2:選擇擇selector1或selector2 這裡我們採用屬性的方式指定選擇器。

這裡我們採用屬性的方式指定選擇器,在頁面的使用是這樣的

@Directive({
selector: '[input-trim]'
})

再模版中使用的時候 直接寫input-trim

<input type="text" id="name" input-trim>

如果你使用類名選擇是這樣的

<input type="text" id="name" class="input-trim">

後面依次類推

HostListener

HostListener 是屬性裝飾器,用來為宿主元素新增事件監,類似於我們原生JavaScript的addEventListener。 這裡我們監聽了keyup事件(還可以定義原生JavaScript中的其他事件),當表單中有輸入的時候我們就會呼叫方法,傳遞了一個$event物件進去,後面緊跟我們觸法keyup事件的方法體

@HostListener('keyup', ['$event.target'])
keyupFun(evt) {
if (evt.value) {
this.elementRef.nativeElement.value = evt.value.trim();
 
}
}

ElementRef(注意:需要在建構函式中注入進去)
用於獲取獲取DOM節點相關的屬性
這裡我們當我們在頁面表單輸入的時候,會呼叫keyupFun方法,首先判斷是否有值輸入,有的情況下,我們通過傳遞進來的evt獲取表單的value值,在呼叫trim()方法去除空格,賦值給elementRef.nativeElement.value渲染到頁面

第二步、在app.module宣告
我們的指令寫好之後還要在app.module的declarations中宣告才能生效

import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {AppComponent} from './app.component';
import {InputTrimDirective} from "./direcitve/input-trim.directive";

@NgModule({
 declarations: [
   AppComponent,
   
InputTrimDirective
 ],
 
imports: [
   BrowserModule,
   
FormsModule,
 
],
 
bootstrap: [AppComponent]
})
export class AppModule {
}

第三步、在模板檔案中引用指令

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

@Component({
selector: 'app-root',
 
template: `<label for="name">姓名</label>  
            <input type="text" id="name" input-trim>`
,
})
export class AppComponent {
title = 'app works!';
}

第四步、頁面展示


擴充套件Host
這裡如果我們不採用HostListener屬性裝飾器來監聽事件,我們可以在指令的 metadata 資訊中,設定宿主元素的事件監聽資訊,具體示例如下:

import {Directive, ElementRef, HostListener} from "@angular/core";
@Directive({
selector: '[input-trim]',
host: {
'(keyup)': 'keyupFun($event.target)'
}
})
export class InputTrimDirective {
constructor(public elementRef: ElementRef) {
}

keyupFun(evt) {
if (evt.value) {
this.elementRef.nativeElement.value = evt.value.trim();
}
}
}

這種方式的實現效果跟上面是一樣

這裡不僅可以是監聽事件,還可以自定義屬性,看看下面程式碼

import {Directive} from "@angular/core";
@Directive({
selector: '[input-trim]',
host: {
'role-data': 'hello world'
}
})
export class InputTrimDirective {

}

這裡我們自定義了一個屬性 role-data,對應值為 hello world(這裡為了演示,此屬性沒有任何意義),再看看頁面input表單中就會有一個role-data屬性,看下面圖片


個人學習心得,大神路過 ,不喜勿噴
有問題加我微信提問或者留言



相關推薦

Angular2-定義指令@Directive

​我們按照下面的步驟一步一步帶著思考去學習,相信很容易就能掌握Angular自定義指令,廢話不多少,開始學習,你準備好來嗎? 概述 所謂指令就是用於改變一個DOM元素的外觀或行為,Angular2為我們封裝了很多的內建指令,專案中也無時無刻不在使用指令,Angular

定義指令directive基礎用法

16px .com input -s guide ima spa 字數 alt 官方鏈接:http://doc.vue-js.com/v2/guide/custom-directive.html#simplest-directive-example 在main.js中註冊自

vue2定義指令directive

除了核心功能預設內建的指令 (v-model 和 v-show),Vue 也允許註冊自定義指令。注意,在 Vue2.0 中,程式碼複用和抽象的主要形式是元件。然而,有的情況下,你仍然需要對普通 DOM

AngularJS定義指令directive:父類scope和指令中scope之間的通訊

我們知道angularJs中,指令中有scope,父類controller中也有scope,兩者的通訊方式有三中,分別是 scope:false;直接使用父類的scope scope:true;繼承父類的scope scope:{@,=,&}隔離的s

AngularJS定義指令directive:scope屬性

一、介紹: 在AngularJS中,除了內建指令如ng-click等,我們還可以自定義指令。自定義指令,是為了擴充套件DOM元素的功能。程式碼中,通過指定directive中的restrict屬性,來決定這個指令是作為標籤(E)、屬性(A)、屬性值(C)、

Vue定義指令directive,外掛的封裝以及混合mixins

一.自定義指令directive 除了核心功能預設內建的指令 (v-model 和 v-show),Vue

angular 定義指令詳解 Directive

聲明 其他 原型繼承 創建 tool 兩個 模板 變化 組合 廢話不多說,下面就直接上代碼 //angular指令的定義,myDirective ,使用駝峰命名法 angular.module(‘myApp‘, []) .directive(‘myDirective‘,

Vue.directive 定義指令的問題

script new amp bsp binding 官網 文件 技術分享 post 1.今天復習一下Vue自定義指令的代碼,結果出現一個很無語的結果,先貼代碼。 2. <div id="example" v-change-by="myColor"><

通過定義指令Angular2中使用Echarts (實用)

原文出處:https://blog.csdn.net/idomyway/article/details/79658099 前言     echarts是第三方js庫,不是ts編寫,沒有型別定義,我們可以引入型別定義的庫@types,查詢是否有echarts,很高興其他人已

挖坑指南:Vue.directive()定義指令的實踐(含原始碼)

前言 迫不及待想要上車試一試,直接貼程式碼吧。 開始 兩個小例子,圖片的載入優化以及第三方外掛的配合使用。參考的資料在我分享的這篇博文中有記錄,感興趣的同學,可以參考更多。 <!DOCTYPE html> <html lang="en"> <hea

Vue.directive全域性定義指令案例

今天正好這個知識點有點淡忘了,就隨筆一下吧: Vue.directive(引數1,引數2) 引數1:指令名稱,如"drag" 引數2:指令要實現的回撥函式,其中回撥函式中也有兩個引數,其中:     引數1:指令繫結的元素,如 el     引數2:是一個物件,其中有兩個引數(value,modif

Vue全家桶實踐(六)---定義指令directive

最近公司要重寫運營管理系統,不想再維護之前的backbone了,趕緊要求前端整個重寫。重開新坑,用了兩週多擼出了第一版,收穫很大。在實踐中學習永遠都是最高效的。趁熱把學到的東西都記錄總結下來,也算

Vue.directive 定義指令

一、什麼是全域性API? 全域性API並不在構造器裡,而是先宣告全域性變數或者直接在Vue上定義一些新功能,Vue內建了一些全域性API,比如我們今天要學習的指令Vue.directive。說的簡單些就是,在構造器外部用Vue提供給我們的API函式來定義新的功能。

Vue directive定義指令+canvas實現H5圖片壓縮上傳-Base64格式

前言 最近優化專案-手機拍照圖片太大,回顯速度比較慢,使用了vue的自定義指令實現H5壓縮上傳base64格式的圖片 canvas自定義指令 Vue.directive("canvas",

通過定義指令Angular2中使用Echarts

前言     echarts是第三方js庫,不是ts編寫,沒有型別定義,我們可以引入型別定義的庫@types,查詢是否有echarts,很高興其他人已經幫忙實現了。我們只要匯入就行。     在網上查詢呼叫ng2呼叫echarts的方法,比較多的是ngx-e

angular創建定義指令的四種方式

htm mil 成功 評論 utf-8 例如 angularjs size 限制   angular除了內置的部分指令,還可以通過.directive來自定義指令。要調用自定義指令,HTML 元素上需要添加自定義指令名。使用駝峰法來命名一個指令:nsHeader,在調用時使

angularJS1筆記-(10)-定義指令(templateUrl屬性)

clas angular ima 追加 set provider black text rep index.html: <!DOCTYPE html> <html lang="en"> <head> <meta chars

angular 定義指令 詳解--restrict、restrict、replace

emp bold span 類型 ret space con 設置 註意 Angularjs 允許根據實際業務需要自定義指令, 通過angular全局對象下的 directive 方法實現。可以自定義屬性、自定義標簽、自定義功能 接下來定義一個名叫custom的指令,並利用

Angular-定義指令-下

接下來 -h 模塊 use 相互 讓我 model too 服務 自定義指令學習有段時間了,學了些紙上談兵的東西,還沒有真正的寫個指令出來呢。。。所以,隨著學習的接近尾聲,本篇除了介紹剩余的幾個參數外,還將動手結合使用各參數,寫個真正能用的指令出來玩玩。   我們在自定義指

angualar入門學習-- 定義指令 指令編譯執行過程

監聽 監聽器 註冊 sco lar scl $watch 學習 排序 3個階段: 一、加載階段 加載angular.js的源碼,找到ng-app確定應用邊界範圍。 二、編譯階段 compile 查找所有指令,保存在一個列表中 對所有指令按優先級(property屬性值)排序