angular-自定義指令-E

angular自定義指令

(1)directive---restrict屬性EACM

(function() {

? 'use strict';

? angular.module('app')

? ? .directive('searchTitle', ['$timeout', function($timeout) {

? ? ? return {

? ? ? ? restrict: 'EA',

? ? ? ? }

E:元素,html使用方式:<my-directive></my-directive>

A:屬性,html使用方式:<div my-directive></div>

C:class屬性,html使用方式:<div class="my-directive"></div>

M:注釋,html使用方式:<!-- directive:my-directive -->

(2)directive---scope隔離作用域,用戶和父作用域進(jìn)行溝通交互的方式,三種形式:@,=,&

@ : ?表示單向綁定,接收父作用域的一個(gè)變量值,值改變后不影響父作用域的變量值

= :引用傳遞,與父scope中的屬性進(jìn)行雙向綁定

& : ?傳遞一個(gè)來自父scope的函數(shù),一個(gè)操作

?return {

? ? ? ? restrict: 'EA',

? ? ? ? scope:{

? ? ? ? ? ? ? ?highSearch: '@', ?//值傳遞 (字符串,單向綁定)

? ? ? ? ? ? ? searchData:'&', ? //傳遞一個(gè)來自父scope的函數(shù),一個(gè)操作,這個(gè)函數(shù)會(huì)在html對(duì)應(yīng)的js中實(shí)現(xiàn)

? ? ? ? ? ? ? ?inputData:'=' ? ?//引用傳遞,雙向綁定

? ? ? ? ? },

? }

(3)directive---templateUrl模板 ? +?template模板

return { ? template:"<h1>這是自定義指令中的模板</h1>" ?}

結(jié)合replace:true;屬性,當(dāng)restrict為E時(shí),就替換整個(gè)template中的內(nèi)容顯示到頁面

假設(shè),template模板內(nèi)的內(nèi)容過多,就應(yīng)該使用

return{ templateUrl:'tpl/blocks/searchTitle.html',? }來對(duì)應(yīng)一個(gè)單獨(dú)的html模板文件

(4)directive---link ? ?在指令中操作DOM,我們需要link參數(shù),這參數(shù)要求聲明一個(gè)函數(shù),稱之為鏈接函數(shù)。

link: function(scope, element, attrs) {

  // 在這里操作DOM

}

如果指令使用了require選項(xiàng),那么鏈接函數(shù)會(huì)有第四個(gè)參數(shù),代表控制器或者所依賴的指令的控制器。

// require 'SomeController',

link: function(scope, element, attrs, SomeController) {

  // 在這里操作DOM,可以訪問required指定的控制器

}

參數(shù)說明:scope,element, attrs

scope:即與指令元素相關(guān)聯(lián)的當(dāng)前作用域,可以用來注冊(cè)監(jiān)聽器:scope.$watch()

element:即當(dāng)前指令對(duì)應(yīng)的元素,使用它可以操作該元素及其子元素。例如,這個(gè)span就是指令?my-directive所使用的元素。

attrs:由當(dāng)前元素的屬性組成的對(duì)象。

到此,設(shè)置E屬性嘗試


html文件

1.html

對(duì)應(yīng)的js文件:

1.js

觀察1.html,可以發(fā)現(xiàn)my-dir是個(gè)自定義指令,

<my-dir ? name="{{customerName}}" ? amount="credit" ? save="saveChanges('我是自定義指令中要響應(yīng)的事件')" ?></my-dir>

自定義指令directive文件:

myDir.js

解析此文件,restrict設(shè)置為”E“,頁面呈現(xiàn)為元素,scope作用域中name為單向值傳遞,amount為雙向綁定,save為傳遞一個(gè)來自父scope的函數(shù),一個(gè)操作

template:"<div>"+"{{name}}: <input ? ng-model='amount' ?/>" ?+ "<button ?ng-click='save()'>保存</button>" ?+ "<div>",結(jié)合replace為true,就替換模板內(nèi)容。

其中button的ng-click = 'save()',那么這個(gè)save事件的響應(yīng),就靠指令和js交互了,

scope中配置了save:"&",

頁面html中指令配置的是,<my-dir ? save="saveChanges('我是自定義指令中要響應(yīng)的事件')">,相當(dāng)于把js中的$scope.saveChanges事件傳遞過來了

link在指令中操作dom,

注冊(cè)監(jiān)聽器:scope.$watch("amount",function(newVal,oldval){? ??

? ? ?//這里是監(jiān)聽amount對(duì)應(yīng)的”credit“值的變化,amount="credit"對(duì)應(yīng)的是js的$scope.credit

});

scope.$watch("name",function(newVal,oldval){

? ? ?//這里是監(jiān)聽name對(duì)應(yīng)的{{customerName}}值的變化,頁面中name="{{customerName}}"對(duì)應(yīng)的是js的$scope.customerName

});


//發(fā)現(xiàn)文章?https://blog.csdn.net/baidu_24024601/article/details/52710331

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容