摘要:我們通常通過其區分大小寫的規范化名稱例如,來定義指令。在其目前的實現上,我們應該需要去創建一些不同點控制器用來重用這個指令。如此,綁定是理想的將回調函數綁定到指令行為。這被指令調用指明。前綴表示該指令在其父元素上搜索控制
文檔翻譯至angularjs.org. 文檔解釋了您何時想在AngularJS應用程序中創建自己的指令,以及如何實現它們。 | 建議搭配原文食用 |
什么是指令?在高層次上,指令時DOM元素上的標記(作為屬性,元素名,注釋和CSS類)用來告訴Angularjs的HTML Compiler($compile)附加特定的行為在此DOM元素上(例如,通過事件監聽),或者甚至去轉換DOM元素和他的子元素。
Angularjs附加了一系列內建的執行,像ngBind, ngModel, and ngClass. 和你創建的控制器和服務一樣,你可以創建你自己的指令來供Angularjs使用. 當Angularjs 啟動(bootstraps)你的應用時,HTML compiler遍歷DOM匹配DOM元素對應的指令。
What does it mean to "compile" an HTML template? For AngularJS, "compilation" means attaching directives to the HTML to make it interactive. The reason we use the term "compile" is that the recursive process of attaching directives mirrors the process of compiling source code in compiled programming languages.
指令匹配
在我們開始寫指令之前, 我們需要知道當使用一個給定的指令, Angularjs的 HTML Compiler是如何判斷的
與元素匹配選擇器(element matches a selector)時使用的術語類似,當指令是其聲明的一部分時,我們說元素匹配指令。
在下面的例子中,我們說元素匹配ngModel指令
以下元素也匹配ngModel:
以下
Normalization (暫譯 規范化){{name}}
AngularJS規范化元素的標簽和屬性名稱,以確定哪些元素與哪些指令相匹配。我們通常通過其區分大小寫的camelCase規范化名稱(例如,ngModel)來定義(refer to)指令。然而,由于HTML是大小寫不敏感的,我們通過小寫形式在DOM中引用指令,通常使用dash(-)分割符分割不同的單詞(例如ng-model)
規范化過程如下:
1.剔除 元素/屬性開頭的 x- , data- ;
2.將 - , _ ,: 分隔符轉換為小駝峰式 camelCas
例如,以下形式都是等同的,并且與ngBind指令相匹配:
指令類型Hello
A - attributesC - class nameE - element nameM - comments
Best Practice: Prefer using directives via tag name and attributes over comment and class names.Doing so generally makes it easier to determine what directives a given element matches.
Best Practice: Comment directives were commonly used in places where the DOM API limits the ability to create directives that spanned multiple elements (e.g. inside 首先讓我們討論下注冊指令的API(API for registering directives). 和控制器一樣,指令也是注冊在模塊之上的。為了注冊一個指令,你需要使用 module.directive API。module.directive接受標準化的指令名稱,后跟一個工廠函數。這個工廠函數應該返回一個具有不同選項的對象來告訴$compile指令在匹配時應該如何表現。 當$conpile第一次匹配指令時,工廠函數僅被調用一次。你可以在這里指令任意的初始化工作。該(工廠)函數使用 $injector.invoke 來調用這使得它可以像控制器一樣是可注射。 我們將通過一些常見的指令示例,然后深入探討不同的選項和編譯過程。 Best Practice: In order to avoid collisions with some future standard, it"s best to prefix your own directive names. For instance, if you created a 作為后續示例,我們將使用my前綴(例如 myCustomer)。 假設您有一大塊代表客戶信息的模板。這個模板在您的代碼中重復多次。當你在一個地方改變它時,你必須在其他幾個地方改變它。這是使用指令簡化模板的好機會。 讓我們創建一個指令,用一個靜態模板簡單地替換它的內容: 注意我們在這個指令中有bindings。在$compile編譯和鏈接 在上面的例子中,我們列出了模板選項(template attribute of return object in factory function),但隨著模板大小的增長,這將變得令人討厭。 Best Practice: Unless your template is very small, it"s typically better to break it apart into its own HTML file and load it with the templateUrl option. 如果你熟悉ngInclude,templateUrl就像它一樣工作。下面是使用templateUrl代替的相同示例: templateUrl也可以是一個函數,它返回要加載和用于指令的HTML模板的URL。AngularJS將使用兩個參數調用templateUrl函數:指令被調用的元素以及與該元素相關聯的attr對象。 Note: You do not currently have the ability to access scope variables from the templateUrl function, since the template is requested before the scope is initialized https://plnkr.co/edit/gaSYwnp... restrict 選項通常設置為: When should I use an attribute versus an element? Use an element when you are creating a component that is in control of the template.The common case for this is when you are creating a Domain-Specific Language for parts of your template. Use an attribute when you are decorating an existing element with new functionality. 用元素來使用myCustomer指令時明智的選擇,因為你不用一些“customer”行為修飾一個元素,你定義一個元素核心行為作為一個costomer組建。 我們以上的myCustomer指令很好,但是它有一個致命缺陷。我們只有在一個給定的scope下使用。 在其目前的實現上,我們應該需要去創建一些不同點控制器用來重用這個指令。 這明顯不是一個好的解決方案。 我們說項的是把指令內部的scope與外部scope(controller scope)分離,并且映射外部scope到指令內部scope。我們可以通過創建一個isolate scope來做。為此,我們可以使用指令的scope選項。 https://plnkr.co/edit/E6dTrgm... 讓我們仔細看看scope選項 除了可以將不同的數據綁定到指令中的作用域外,使用isolated scope還有其他作用。 我們可以通過添加另一個屬性vojta來展示,到我們的scope并嘗試從我們的指令模板中訪問它: 請注意{{vojta.name}}和{{vojta.address}}為空,意味著它們未定義(undefined)。雖然我們在控制器中定義了vojta,但它在指令中不可用。 顧名思義,該指令的 isolate scope隔離了除顯式添加到作用域的模型之外的所有內容:scope: {}散列對象. 這在構建可重用組件時很有用,因為它可以防止組件改變模型狀態,除了顯式傳入。 Note: Normally, a scope prototypically inherits from its parent. An isolated scope does not. See the "Directive Definition Object - scope"section for more information about isolate scopes. Best Practice: Use the scope option to create isolate scopes when making components that you want to reuse throughout your app. 在這個例子中,我們將建立一個顯示當前時間的指令。每秒一次,它會更新DOM以反映當前時間。 想要修改DOM的指令通常使用link選項來注冊DOM監聽器以及更新DOM。它在模板被克隆之后執行,并且是放置指令邏輯的地方。 link接受一個帶有一下簽名的函數function link(scope, element, attrs, controller, transcludeFn) { ... }, 其中: scope是一個Angularjs scope 對象 element 是一個此指令匹配的jqLite包裝元素 attrs是一個具有標準化屬性名稱及其對應屬性值的鍵值對的散列對象。 controller是指令所需的控制器實例或其自己的控制器(如果有的話)。確切的值取決于指令的 require屬性。 transcludeFn是預先綁定到正確的包含范圍的transclude鏈接函數。 For more details on the link option refer to the $compile API page. 在我們的link函數中,我們想每秒鐘更新顯示時間,或者一個用戶改變了我們指令綁定的時間格式字符串。我們將會使用$interval服務定期調用處理程序。這比使用$ timeout更容易,但對于端到端測試也更好,我們希望確保在完成測試之前完成所有$timeout。如果指令被刪除,我們也想刪除$ interval,所以我們不會引入內存泄漏 這里有幾件事需要注意。就像module.controller API一樣,module.directive中的函數參數是依賴注入的。因此,我們可以在指令的鏈接函數中使用$ interval和dateFilter。 我們注冊一個事件element.on("$ destroy",...)。什么引發了這個$ destroy事件? AngularJS發布了一些特殊事件。當用AngularJS的編譯器編譯的DOM節點被銷毀時,它會發起$ destroy事件。同樣,當Angularjs scope被銷毀,他會廣播(broadcasts)一個$destory事件監聽scopes。 通過監聽此事件,可以刪除可能導致內存泄漏的事件偵聽器。注冊到scope和element的監聽事件在銷毀DOM時會自動清理,但是如果您在服務上注冊了偵聽器,或者在未被刪除的DOM節點上注冊了偵聽器,你必須自己清理它,否則你有冒險引入內存泄漏的風險。 Best Practice: Directives should clean up after themselves. You can use element.on("$destroy", ...) or scope.$on("$destroy", ...) to run a clean-up function when the directive is removed. 我們已經看到,您可以使用isolate scope將模型傳遞給指令,但是有時候想要能傳入一整個模板而不是一個字符串或者對象。我們說我們想要創建一個“dialog box”組建。dialog box應該有能力包裝任意的內容(any arbitrary content)。 為此,我們需要使用transclude選項。 transclude選項到底做了什么呢?transclude使指令的內容通過此選項擁有可訪問外部指令的scope不是內部的scope。 為了說明了這一點,請看下面的例子。注意,我們在script.js中添加了一個link函數,將名稱重新定義為Jeff。您認為{{name}}綁定將會得到什么結果? 照常,我們以為{{name}}應該是Jeff。但是,我們看見的是Tobias。 transclude選項改變了scope的嵌套方式。它使得一個transcluded指令的內容具有在指令之外的任何scope內容,而不是任何內部的scope。這樣做,它可以讓內容訪問外部scope。 請注意,如果指令沒有創建自己的獨立作用域,那么scope.name ="Jeff"中的作用域將引用外部作用域,我們會在輸出中看到Jeff。 這種行為對于封裝某些內容的指令是有意義的,因為否則,您必須分別傳入每個您想要使用的模型。如果你必須傳入每一個你想要的model,那么你不能真正的使用任意的內容,對嗎? Best Practice: only use transclude: true when you want to create a directive that wraps arbitrary content. 接下來,我們要在此對話框中添加按鈕,并允許使用該指令的用戶將自己的行為綁定到該對話框。 我們希望通過從指令的作用域調用它來運行我們傳遞的函數,但是它會在注冊作用域的上下文中運行。 我們在之前已經看到在scope選項中如何使用 =attr,但是在上面的例子中,我們使用了&attr代替。 &綁定允許一個指令去觸發一個原始范圍內的表達式的評估,在一個特定時間點上。任何合法的表達式都是允許的,包括一個含有函數調用的表達式。如此,& 綁定是理想的將回調函數綁定到指令行為。 當用戶點擊dialog中的 x,指令的close函數被調用,多虧于ng-click。這個close調用在isolated scope之上,實際上會在原始scope的上下文中評估表達式 hideDialog(message),導致運行Controller中的hideDialog function。 通常期望通過一個表達式從isolate scope傳入數據到父scope,這可以通過將局部變量名稱和值的映射傳遞到表達式包裝函數來完成。例如,hideDialkog函數接受一個message來顯示當dialog被隱藏是。這被指令調用 close({message: "closing for now"})指明。接著局部變量message將在on-close表達式內被訪問(is available). Best Practice: use &attr in the scope option when you want your directive to expose an API for binding to behaviors. 以前,我們使用鏈接函數來創建操縱其DOM元素的指令。在這個例子的基礎上,讓我們制定一個對其元素事件做出反應的指令。 例如,如果我們想創建一個允許用戶拖拽元素的指令呢? 你可以組建任何指令通過模板使用他們。 有時,你需要一個由指令組合構建的組件。 想象你想要有一個容器,其中容器的內容對應于哪個選項卡處于活動狀態的選項卡。 myPane指令有require選項值為^^myTabs. 當指令使用此選項,&compile將拋出一個錯誤除非特定的controller被找到。 ^^前綴表示該指令在其父元素上搜索控制器。(^前綴將使指令在自身元素或她的父元素上尋找控制器;又沒任何前綴,指令將值操作自身) 所以這個myTabs contoller從哪里來的?指令可以特定一個controllers通過使用 controller選項。如你所見,myTabs指令使用了此選項。就像ngController,此選項附加一個控制器到指令的模板上。 如果需要從模板中引用控制器或綁定到控制器的任何功能,則可以使用選項controllerAs將控制器的名稱指定為別名。該指令需要定義要使用的此配置的范圍。這在指令被用作組件的情況下特別有用。 回頭看myPane的定義,注意到link函數的最后一個參數:tabCtrl。當指令需要控制器時,它將接收該控制器作為其link函數的第四個參數。利用這一點,myPane可以調用myTabs的addPane函數。 如果需要多個控制器,則指令的require選項可以采用數組參數。發送給鏈接函數的相應參數也將是一個數組。 明的讀者可能想知道鏈接和控制器之間的區別。基本的區別是控制器可以暴露一個API,并且鏈接函數可以使用require與控制器交互。 Best Practice: use controller when you want to expose an API to other directives. Otherwise use link. 到此我們已經看了大多數指令的用法,每一個樣例演示了一個創建你自己指令的好的起始點。 你可能深入感興趣于編譯過程的解釋可以在這里獲得compiler guide. $compile API 有一個全面的指令清單選項以供參考。 如有任何問題和建議歡迎發送至郵箱討論: 微信: 支付寶: 文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。 轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107818.html 摘要:在這篇文章中,我將告訴你如何用編寫自定義指令。中的自定義指令讓我們來創建一個只為任何的塊,小部件或者人名在右邊添加標題,子標題和文本的指令。另外,設置了指令的使用級別給元素和屬性,分別使用和表示。
原文鏈接 : How to write custom AngularJS Directive using TypeScript?原文作者 : Siddharth Pandey譯者 : 李林璞... 摘要:到目前為止,使用越來越廣泛,不光光只是它強大的生成技術,而且它能夠與進行很好的集成。注意使用數字范圍來定義集合時無需使用方括號數字范圍也支持反遞增的數字范圍如對象對象使用花括號包括中的對之間以英文冒號分隔,多組對之間以英文逗號分隔。
Freemarker的介紹
??Freemarker 是一款模板引擎,是一種基于模版生成靜態文件的通用 工具,它是為程序員提供的一個開發包,或者說是一個類... 摘要:在運用的時候,運用自定義指令可以寫一些組件,非常方便。這里給大家分享一些關于自定義指令的知識。
在運用angularjs的時候,運用自定義指令可以寫一些組件,非常方便。這里給大家分享一些關于angular自定義指令的知識。
1. 定義
對于指令,可以把它簡單的理解成在特定DOM元素上運行的函數,指令可以擴展這個元素 的功能。
2.定義指令的方法:
angular.module(myAp... 摘要:本質上,本文主要解釋內部是如何定義組件和指令的,并引入新的視圖節點定義指令定義。大多數指令使用屬性選擇器,但是有一些也選擇元素選擇器。實際上,表單指令就是使用元素選擇器來把特定行為附著在元素上。但是由于編譯器會為每一個
原文鏈接:Here is why you will not find components inside Angular
showImg(https://segmen... 摘要:供用戶在相應的階段對其進行操作。我們像下面這樣使用這個指令大多數情況下,我們只需要使用與鉤子函數。里提供了函數的簡寫形式鉤子函數有兩個常用的參數和。其他用法與全局自定義指令一致。
一、vue生命周期
vue實例從創建到銷毀的過程,稱為生命周期,共有八個階段。
這八個階段里分別有一個叫做鉤子函數的實例選項。供用戶在相應的階段對其進行操作。
beforeCreate(){ //組件實例剛... 閱讀 1891·2021-11-22 09:34 閱讀 3025·2021-09-28 09:35 閱讀 13430·2021-09-09 11:34 閱讀 3599·2019-08-29 16:25 閱讀 2826·2019-08-29 15:23 閱讀 2041·2019-08-28 17:55 閱讀 2431·2019-08-26 17:04 閱讀 3049·2019-08-26 12:21 elements). AngularJS 1.2 introduces ng-repeat-start and ng-repeat-end as a better solution to this problem. Developers are encouraged to use this over custom comment directives when possible..
創建指令
https://jsfiddle.net/TommyLee...
https://plnkr.co/edit/idFOZ8Q...
注:(要訪問socpe上的值,應該在post-link階段).
https://plnkr.co/edit/CKEgb1e...
看index.html文件,第一個//...
scope: { customerInfo: "=info" },
//...
https://plnkr.co/edit/xLVqnzt...
https://plnkr.co/edit/vIhhmNp...
https://plnkr.co/edit/empMwVW...
https://plnkr.co/edit/OEdkXY4...
https://plnkr.co/edit/Bo5lona...
https://plnkr.co/edit/hcUyuBY...
https://plnkr.co/edit/kqLjcwG...
angular.module("docsTabsExample", [])
.directive("myPane", function() {
return {
require: ["^^myTabs", "ngModel"],
restrict: "E",
transclude: true,
scope: {
title: "@"
},
link: function(scope, element, attrs, controllers) {
var tabsCtrl = controllers[0],
modelCtrl = controllers[1];
tabsCtrl.addPane(scope);
},
templateUrl: "my-pane.html"
};
});
翻譯不易,若您覺得對您有幫助,歡迎打賞相關文章
[譯] 如何使用 TypeScript 編寫自定義 AngularJS 指令?
工具集核心教程 | 第六篇: Freemarker模板引擎入門到進階
angular自定義指令詳解
[譯] 為何 Angular 內部沒有發現組件
vue學習筆記(二)
發表評論
0條評論
zzbo
男|高級講師
TA的文章
閱讀更多
編程界也有修仙秘籍?程序員碼字3年終得《JavaScript 百煉成仙》
水濁度傳感器
502網關錯誤是什么錯誤?502網關錯誤,連接源站失敗解決方法
對vuex在項目中的使用
FCC 成都社區·技術周刊 第 12 期
使用css實現全兼容的三角形
10分鐘理解JS引擎的執行機制
項目中配置Babel轉碼器的詳細教程