1. 程式人生 > >AngularJS學習筆記之directive——scope選項與繫結策略

AngularJS學習筆記之directive——scope選項與繫結策略

開門見山地說,scope:{}使指令與外界隔離開來,使其模板(template)處於non-inheriting(無繼承)的狀態,當然除非你在其中使用了transclude嵌入,這點之後的筆記會再詳細記錄的。但是這顯然不符合實際開發中的需求,因為實際上,我們經常想要我們的指令能夠在特定的情況下與外界進行資料上的互動,這就需要藉助繫結策略之手了。

大家知道,當scope選項寫為scope:{}這種形式的時候,就已經為指令生成了隔離作用域,現在,我們來看看繫結策略的三種形式:& 、= 、@。

首先是@,它將本地作用域和DOM中的屬性值繫結起來(且這個屬性的值必須是父級作用域中的),什麼意思呢?說的簡單一點就是假設你在模板中有個雙花括號表示式,然後我們把表示式裡的內容和html中指令裡特定名字的屬性繫結起來,還是不懂?看看下面的程式碼:

JS程式碼:

directive("direct",function(){
 
        return{
 
            restrict: 'ECMA',
 
            template: '<div>指令中:{{ name }}</div>',
 
            scope:{
 
              name:'@forName'
 
            }
        } 
  })
.controller("nameController",function($scope){
      $scope.Name="張三"; 
});
 

HTML程式碼:

<div ng-controller="nameController">
  <direct for-name="{{ Name }}"></direct>
<div>

執行結果可想而知,{{ name }}成功地與父控制器中的Name繫結起來了。當然這裡也可以這樣寫

name:'@' 這樣寫的話,就預設DOM中的屬性名為name了意即 for-name="{{ Name }}"可簡寫為name="{{ Name }}";其實,另外兩個符號=和&也有這樣的簡寫規則,方便起見接下來都使用這種寫法。

        @到此為止,接下來就是'='了。=與@的不同點在於,@是針對字串而用,但=是針對某個物件的引用,

這麼說可能不太專業,但就拿上邊的例子而言,我們在html中,把Name這個字串通過一對雙花括號傳遞給for-name屬性,但如果我們用了=,這裡傳入的Name就不應該是一個字串,而是一個物件的引用。這不是一個很一目瞭然的概念,所以我用接下來的兩個例子詮釋它的含義。

 第一個例子:陣列中的物件的引用

JS程式碼:

directive("direct",function(){
 
 
        return{
 
 
            restrict: 'ECMA',
 
 
            template: '<div>指令中:{{ case.name }}</div>',
 
 
            scope:{
 
 
              case:'='
 
 
            }
 
        } 
 
  })
 
.controller("nameController",function($scope){
 
      $scope.data=[{name:"張三"},{name:"李四"}]; 
 
});
 

HTML程式碼:

<div ng-controller="nameController">
 
  <direct case="data[0]"></direct>
 
  <direct case="data[1]"></direct> 
<div>

結果就是,一個張三,一個李四。這個例子中,data是一個物件陣列,裡面包含了兩個物件,所以,我們分別把兩個物件傳遞給了case這個屬性,case屬性就把這個物件的引用傳遞給了模板中我們寫的{{ case.name }}中的case;而如果你在=後邊加上了自己定義的名字,那隻要把html裡case屬性換成那個名字就可以了。

第二個例子:經典的雙向輸入框

按照Angular的入門案例,建立兩個雙向繫結的輸入框,最簡單的實現方式就是:

<input ng-model="test"/>
 <input ng-model="test"/>

使用ng-model指令就可以做到了。接著,我們在自己的指令中實現這個效果。

JS程式碼:

directive("direct",function(){
 
 
 
        return{
 
 
 
            restrict: 'ECMA',
 
 
 
            template: '<div>指令中:<input ng-model="model"/></div>',
 
 
 
            scope:{
 
 
 
              model:'='
 
 
 
            }
 
 
        } 
 
 
  })
 
.controller("nameController",function($scope){
 
 
      $scope.data=[{name:"張三"},{name:"李四"}]; 
 
 
});
 

HTML程式碼:

 <div ng-controller="nameController">
 
        父級scope中:<input ng-model="mark"/>
  
        <direct model="mark"/></direct>
 </div>
 

這就完成了,其實只不過是加了一點小把戲,把ng-model換成了model而已。

注意到,這兩個例子中,都是使用物件的引用,而不是單純的字串,這也是=可以進行雙向繫結的關鍵。

      最後是&符號。它的含義是:對父級作用域進行繫結,並將其中的屬性包裝成一個函式,注意,是屬性,意即,任何型別的屬性都會被包裝成一個函式,比如一個單純的字串,或是一個物件陣列,或是一個函式方法,如果是字串、物件陣列和無參的函式,那麼可想而知,它們都會被包裝成一個無參的函式,若是有參的函式方法則反之,並且我們需要為其傳入一個物件。現在,分別針對有參和無參兩種情況舉例。

無參情況↓

JS程式碼:

.directive("direct",function(){
 
 
 
 
        return{
 
            restrict: 'ECMA',
 
            template: '<div>{{ title }}</div>'+'<div><ul><li ng-repeat="x in contents">{{ x.text }}<                      /li></ul></div>',
  
            scope:{
                
              getTitle:'&', 
              getContent:'&'            
        },
            controller:function($scope){ 
              $scope.title=$scope.getTitle();    //呼叫無參函式  
              $scope.contents=$scope.getContent();    //呼叫無參函式 
          } 
      } 
 })
 
 
.controller("nameController",function($scope){
 
    $scope.title="標題";
 
    $scope.contents =[{text:1234},{text:5678}]; 
});
 

 HTML程式碼:

<div ng-controller="nameController">
      <direct get-title="title" get-content="contents"></direct> 
  </div>

這個例子有幾個注意點:

1.指令的本地屬性(即模板裡花括號中的屬性)需要從本地取值,所以使用了controller選項,而在controller選項中,兩個無參方法分別返回了父級scope中的title字串和contents物件陣列。

2.在HTML中,我們把設定了get-title和get-content的屬性值為title和contents,這實際上就完成了與父級scope的繫結,因為我們才可以從那兒取得實質的內容。

OK,有參情況↓

JS程式碼:

.directive("direct",function(){ 
return{
            restrict: 'ECMA',
            template: '<div><input ng-model="model"/></div>'+'<div><button ng-click="show({name:model})">show</button>',
            scope:{
                show:'&'              
            }                      
        }
    })
 
    .controller("nameController",function($scope){
        $scope.showName=function(name){ 
  
          alert(name); 
        } 
    });
 

HTML程式碼:

<div ng-controller="nameController">
 
      <direct show="showName(name)"></direct> 
 
  </div>

這個例子中,通過模板中的ng-click觸發了show函式並將一個叫做model的物件作為name引數傳遞了進去,而在html中,我們把show的屬性值設為showName(name)。這其中的道理跟無參的例子是大同小異的。

大功告成,@,=,&的繫結策略大概就是這樣了。有什麼需要補充和糾正的,我懇請各位大神向我提出,謝謝!

一些AngularJS相關文章連結

希望你喜歡,並分享我的工作~帶你走近AngularJS系列

AngularJS 的詳細介紹請點這裡
AngularJS 的下載地址請點這裡

相關推薦

AngularJS學習筆記directive——scope選項策略

開門見山地說,scope:{}使指令與外界隔離開來,使其模板(template)處於non-inheriting(無繼承)的狀態,當然除非你在其中使用了transclude嵌入,這點之後的筆記會再詳細記錄的。但是這顯然不符合實際開發中的需求,因為實際上,我們經常想要我們的

scope選項策略

開門見山地說,scope:{}使指令與外界隔離開來,使其模板(template)處於non-inheriting(無繼承)的狀態,當然除非你在其中使用了transclude嵌入,這點之後的筆記會再詳細記錄的。但是這顯然不符合實際開發中的需求,因為實際上,我們經常想要我們的指令能夠在特定的情況下與外界進

《深入理解Java虛擬機器》學習筆記垃圾收集器記憶體分配策略

一、概述 GC(Garbage Collection)需要完成的三件事 (1)哪些記憶體需要回收 (2)什麼時候回收 (3)如何回收 GC主要面向Java堆和方法區中的記憶體 原因:這部份

Android學習筆記MVVM----DataBinding(資料雙向)

要把大象裝冰箱,總共三步! 第一步:在app.gradle中新增一下程式碼 第二步:建立一個普通bean類和XML檔案 注意:xml檔案的命名將影響生成的binding類名,如需要自定義b

ES6學習筆記map、set數組、對象的對比

fin 唯一性 ron foreach -o pty pan es6 odi ES6 ES5中的數據結構,主要是用Array和Object。在ES6中主要新增了Set和Map數據結構。到目前為止,常用的數據結構有四種Array、Object、Set、Map。下面話不多說了

學習筆記——HOG、LBPHaar特徵(未完待續)

本博文為HOG、LBP與Haar運算元的學習筆記。   方向梯度直方圖HOG 主要參考博文如下: https://blog.csdn.net/wjb820728252/article/details/78395092(這篇博文翻譯水平真的太爛了,可以參考裡面給的原連結)

Mybatis學習筆記多對一一對多關係

Mybatis一對多關係 一、資料庫與資料表的建立 學生與班級是一對多的關係,首先建立一個學生表 create table tb_student( -> id int not null auto_increment, -> name varchar(10)

R語言學習筆記set.seed()函式table函式

set.seed(123)函式,此函式作用是為了,但你需要使用隨機數時,可保證你在執行或者除錯後,計算機所創造的隨機數保持不變。換句話說,如果使用隨機函式rnorm(10)之類的函式,每次執行後,結果都是不一樣的,如果再次之前使用set.seed()函式,則會保證測試資料保持

影象處理學習筆記直方圖的計算繪製

影象直方圖包含豐富的影象細節資訊,反映了影象畫素點的概率分佈情況,它統計了每一個強度值具有的畫素個數。灰度級範圍是[0,L-1]的數字影象的直方圖是離散函式h(rk)=nk,其中是rk第k級灰度值,nk是影象中灰度為rk的畫素個數。在實踐中,經常用乘積MN表示的影象畫素總數

CSharp學習筆記十二 委託事件(續)

尼瑪,當把剛才的文章給儲存發表之後,想看看其他方面你的文章,這時候又看到了另外的一個比較不錯的文章,名字與本題同名,正覺得納悶呢,仔細一看,原來是同一作者的東西,頓時有一種被騙的感覺。這些都不重要,真心的不重要,重要的是這些東西我們都能夠學到比較多的東西。所以,這裡就又將那

Android學習筆記淺談@id@+id之間的區別

<Button android:id="@+id/button3" //定義了一個Button取名為button3 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_cen

Linux指令碼攻略學習筆記臨時檔案命名隨機數

最適合儲存臨時資料的位置是 /tmp(該目錄中的內容在系統重啟後會被清空) mktemp 命令的用法非常簡單。它生成一個臨時檔案並返回其檔名(如果建立的是目錄,則返回目錄名)。如果提供了定製模板, X

java學習筆記容器的同步只讀控制

1、容器的同步 多執行緒併發訪問集合的執行緒安全。 常用容器ArrayList、HashMap、HashSet等都是執行緒不安全的。 java.util.Collections提供了synchro

【Linux學習筆記八】檔案檔案系統的壓縮,打包備份

8.2Linux系統常見的壓縮指令   在 Linux 的環境中,壓縮檔案案的副檔名大多是: 『.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz』,為什麼會有這樣的副檔名呢?   這是因為 Linux 支援的壓縮指令非常多,且

《深入理解Java虛擬機器》學習筆記執行緒安全鎖優化

二、執行緒安全 定義: “當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲得

WPF學習筆記:(二)資料模式INotifyPropertyChanged介面

資料繫結模式共有四種:OneTime、OneWay、OneWayToSource和TwoWay,預設是TwoWay。一般來說,完成資料繫結要有三個要點:目標屬性是依賴屬性、繫結設定和實現了INotifyPropertyChanged介面的資料來源(資料上下文)。 One

React 學習筆記 (一)(建立元件、資料、屬性、迴圈資料、引入圖片)

使用 create-react-app 快速構建 React 開發環境 $ cnpm install -g create-react-app $ create-react-app my-app $ cd my-app/ $ npm start 建立元件、繫結資料、繫結屬性、迴圈資

【Vue.js學習筆記】5:雙向資料,計算屬性

雙向資料繫結 雙向資料繫結往往會用到input、select、textarea等表單標籤上,因為總是涉及一個數據資料的地方和輸出資料的地方。 當資料發生變化的時候,檢視也就發生變化,當檢視發生變化的時候,資料也會跟著同步變化。 資料雙向繫結,一定是對於UI控制元件來說的,

python學習筆記列表元組

長度 bsp 最大 一般來說 設置 概述 檢查 常用 而且 一、概述 python包含6種內建的序列,其中列表和元組是最常用的兩種類型。列表和元組的主要區別在於,列表可以修改,元組則不能修改 使用上,如果要根據要求來添加元素,應當使用列表;而由於要求序列不可修改時,此時

《SAS編程數據挖掘商業案例》學習筆記十二

style rename today 降序排序 cat list append span nod 本次重點在:sas數據集管理 主要包含:包含數據集縱向拼接、轉置、排序、比較、復制、重命名、刪除等 1.append語句 註:base數據集