1. 程式人生 > >AngularJS Directive 隔離 Scope 資料互動

AngularJS Directive 隔離 Scope 資料互動

###什麼是隔離 Scope
AngularJS 的 directive 預設能共享父 scope 中定義的屬性,例如在模版中直接使用父 scope 中的物件和屬性。通常使用這種直接共享的方式可以實現一些簡單的 directive 功能。當你需要建立一個可重複使用的 directive,只是偶爾需要訪問或者修改父 scope 的資料,就需要使用隔離 scope。當使用隔離 scope 的時候,directive 會建立一個沒有依賴父 scope 的 scope,並提供一些訪問父 scope 的方式。

###為什麼使用隔離 Scope
當你想要寫一個可重複使用的 directive,不能再依賴父 scope,這時候就需要使用隔離 scope 代替。共享 scope 可以直接共享父 scope,而隔離 scope 無法共享父scope。下圖解釋共享 scope 和隔離 scope 的區別:

圖片

示例可看:

共享 scope

使用共享 scope 的時候,可以直接從父 scope 中共享屬性。因此下面示例可以將那麼屬性的值輸出出來。使用的是父 scope 中定義的值。

js程式碼:

app.controller("myController", function ($scope) {
    $scope.name = "hello world";
    }).directive("shareDirective", function () {
    return {
            template: 'Say:{{name}}'
    }
});

html程式碼

<div
ng-controller="myController">
<div share-directive=""></div> </div>

輸出結果:

Say:hello world

隔離 scope

使用隔離 scope 的時候,無法從父 scope 中共享屬性。因此下面示例無法輸出父 scope 中定義的 name 屬性值。

js程式碼:

app.controller("myController", function ($scope) {
    $scope.name = "hello world";
}).directive("isolatedDirective", function () {
        return {
scope: {}, template: 'Say:{{name}}' } });

html程式碼:

<div ng-controller="myController">
<div isolated-directive=""></div>
</div>

輸出結果:

Say:

從上圖可以看出共享 scope 允許從父 scope 滲入到 directive 中,而隔離 scope 不能,在隔離 scope 下,給 directive 創造了一堵牆,使得父 scope 無法滲入到 directive 中。

##如何在 directive 中建立隔離 scope

在 Directive 中建立隔離 scope 很簡單,只需要定義一個 scope 屬性即可,這樣,這個 directive 的 scope 將會建立一個新的 scope,如果多個 directive 定義在同一個元素上,只會建立一個新的 scope。

angular.module('app').controller("myController", function ($scope) {
    $scope.user = {
            id:1,
            name:"hello world"
    };
}).directive('isolatedScope', function () {
    return {
        scope: {},
        template: 'Name: {{user.name}} Street: {{user.addr}}'
    };
});

現在 scope 是隔離的,user 物件將無法從父 scope 中訪問,因此,在 directive 渲染的時候 user 物件的佔位將不會輸出內容。

##隔離 scope 和父 scope 如何互動
directive 在使用隔離 scope 的時候,提供了三種方法同隔離之外的地方互動。這三種分別是

  • @ 繫結一個區域性 scope 屬性到當前 dom 節點的屬性值。結果總是一個字串,因為 dom 屬性是字串。
  • & 提供一種方式執行一個表示式在父 scope 的上下文中。如果沒有指定 attr 名稱,則屬性名稱為相同的本地名稱。
  • = 通過 directive 的 attr 屬性的值在區域性 scope 的屬性和父 scope 屬性名之間建立雙向繫結。

@ 區域性 scope 屬性

@ 方式區域性屬性用來訪問 directive 外部環境定義的字串值,主要是通過 directive 所在的標籤屬性繫結外部字串值。這種繫結是單向的,即父 scope 的繫結變化,directive 中的 scope 的屬性會同步變化,而隔離 scope 中的繫結變化,父 scope 是不知道的。

如下示例:directive 宣告未隔離 scope 型別,並且使用@繫結 name 屬性,在 directive 中使用 name 屬性繫結父 scope 中的屬性。當改變父 scope 中屬性的值的時候,directive 會同步更新值,當改變 directive 的 scope 的屬性值時,父 scope 無法同步更新值。

js 程式碼:

 app.controller("myController", function ($scope) {
        $scope.name = "hello world";
    }).directive("isolatedDirective", function () {
        return {
            scope: {
                name: "@"
            },
            template: 'Say:{{name}} <br>改變隔離scope的name:<input type="buttom" value="" ng-model="name" class="ng-pristine ng-valid">'
        }
})

html 程式碼:

<div ng-controller="myController">
   <div class="result">
       <div>父scope:
           <div>Say:{{name}}<br>改變父scope的name:<input type="text" value="" ng-model="name"/></div>
       </div>
       <div>隔離scope:
           <div isolated-directive name="{{name}}"></div>
       </div>
        <div>隔離scope(不使用{{name}}):
             <div isolated-directive name="name"></div>
         </div>
   </div>

= 區域性 scope 屬性

= 通過 directive 的 attr 屬性的值在區域性 scope 的屬性和父 scope 屬性名之間建立雙向繫結。
意思是,當你想要一個雙向繫結的屬性的時候,你可以使用=來引入外部屬性。無論是改變父 scope 還是隔離 scope 裡的屬性,父 scope 和隔離 scope 都會同時更新屬性值,因為它們是雙向繫結的關係。

示例程式碼:

js 程式碼:

 app.controller("myController", function ($scope) {
        $scope.user = {
            name: 'hello',
            id: 1
        };
    }).directive("isolatedDirective", function () {
        return {
            scope: {
                user: "="
            },
            template: 'Say:{{user.name}} <br>改變隔離scope的name:<input type="buttom" value="" ng-model="user.name"/>'
        }
    })

html 程式碼:

<div ng-controller="myController">
    <div>父scope:
        <div>Say:{{user.name}}<br>改變父scope的name:<input type="text" value="" ng-model="user.name"/></div>
    </div>
    <div>隔離scope:
        <div isolated-directive user="user"></div>
    </div>
    <div>隔離scope(使用{{name}}):
        <div isolated-directive user="{{user}}"></div>
    </div>
</div>

& 區域性 scope 屬性

& 方式提供一種途經是 directive 能在父 scope 的上下文中執行一個表示式。此表示式可以是一個 function。
比如當你寫了一個 directive,當用戶點選按鈕時,directive 想要通知 controller,controller 無法知道 directive 中發生了什麼,也許你可以通過使用 angular 中的 event 廣播來做到,但是必須要在 controller 中增加一個事件監聽方法。
最好的方法就是讓 directive 可以通過一個父 scope 中的 function,當 directive 中有什麼動作需要更新到父 scope 中的時候,可以在父 scope 上下文中執行一段程式碼或者一個函式。

如下示例在 directive 中執行父 scope 的 function。

js程式碼:

 app.controller("myController", function ($scope) {
        $scope.value = "hello world";
        $scope.click = function () {
            $scope.value = Math.random();
        };
    }).directive("isolatedDirective", function () {
        return {
            scope: {
                action: "&"
            },
            template: '<input type="button" value="在directive中執行父scope定義的方法" ng-click="action()"/>'
        }
    })

html 程式碼:

 <div  ng-controller="myController">
        <div>父scope:
            <div>Say:{{value}}</div>
        </div>
        <div>隔離scope:
            <div isolated-directive action="click()"></div>
        </div>
</div>

使用小結

在瞭解 directive 的隔離 scope 跟外部環境互動的三種方式之後,寫一些通用性的元件更加便捷和順手。不再擔心在 directive 中改變外部環境中的值,或者執行函式的重重困境了。

原文地址:https://blog.coding.net/blog/angularjs-directive-isolate-scope

相關推薦

AngularJS Directive 隔離 Scope 資料互動

###什麼是隔離 Scope AngularJS 的 directive 預設能共享父 scope 中定義的屬性,例如在模版中直接使用父 scope 中的物件和屬性。通常使用這種直接共享的方式可以實現一些簡單的 directive 功能。當你需要建立一個可重複使用的 dir

angularjs指令之間的資料互動

指令可以通過獨立作用域接收資料, 使用=,如 app.directive('myDirective', function() { return { restrict: 'E', transclude: true, scope: { option

AngularJs directive-scope雙向繫結方法處理-例項2

1.Html程式碼: <div class="container-fluid" ng-app="myApp"> <div ng-controller="myC

AngularJS自定義指令directivescope屬性

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

使用AngularJS的$http服務與服務端進行資料互動

$http服務是基於$q服務的,提供了promise封裝,它接受一個配置物件引數,並返回一個promise物件。同時,它還提供了2個方法用來定義Promise回撥:success 和 error。 var promise = $http({method:"GET",

[AngularJS面面觀] 1. scope中的Dirty Checking(髒資料檢查) --- 引言

scope功能概述 scope是AngularJS中的核心概念之一。它的設計思想和實現方式也是希望深入瞭解和學習AngularJS的開發人員必須熟知的。 它的功能主要有以下幾點: 1. 通過資料共享連線Controller和View 2. 事件的監聽和響

[AngularJS面面觀] 2. scope中的Dirty Checking(髒資料檢查) --- Digest Cycle

Dirty Checking的實現方式 瞭解Angular的開發人員都知道,是一種叫做髒資料檢查(Dirty Checking)的機制實現了雙向繫結這一前端開發中的黑科技。那麼在Angular中到底是如何實現它的呢?本文就一一來揭開它的神祕面紗。 一言以蔽之

使用AngularJS實現的前後端分離的資料互動過程

一. AngularJS簡介 AngularJS是什麼 AngularJS是一個開源Web應用程式框架。最初是由MISKO Hevery和Adam Abrons於2009年開發,現

小程式基於SSM資料互動

springmvc框架寫到現在終於牽扯到小程式了(所以別說我“不務正業”),對於一個應用程式來說,它的本質其實就是無數個對資料進行增刪改查的操作,這裡起到至關重要的就是資料,於是這篇帖子的目的就是實現小程式與後臺資料的互動。 小程式使用的是wx.request的api來提交和接收資料,最常見的就

一次有趣的ant-design與後端資料互動的使用

最近有個需求是新聞時間排序與點選量排序,資料庫中儲存的新聞是按照時間順序排序的,從後臺資料中取出資料,在前端進行頁面展示即可。 我用到了ant-design中的Tabs切換頁,樣式大概如下圖。 其實這個專案裡面最令我欣喜的是reducer中介軟體的封裝,無需通過fetch請求資料這些,而是使用另外的封裝中介

Java框架-SpringMVC的應用(json資料互動、控制器方法返回值、檔案上傳)

1. 搭建SpringMVC開發環境 1.1 建立專案,新增依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" x

二十六、python學習之前端(九):JQuery資料互動

一.juqery物件: js中的物件,就是python中的字典: 1定義方法: 定義方法1: var obj1 = {name:"張三", "age":18, "address":"三里屯"} 定義方法2: var obj2 = new Object(); ob

Spring mvc,jQuery和JSON資料互動

一、實驗環境的搭建 1、Spring mvc jar。 匯入spring mvc執行所需jar包。匯入如下(有多餘)     2、json的支援jar       3、加入jQuery。

SpringMVC的json資料互動

                                      SpringMVC的json資料互

使用 自定義的 ContentProvider 進行應用間的資料互動(另一個APP對當前的應用資料進行修改,查詢),getType()等內容的講解

本部落格內容 應用B 對 應用A的資料庫資料進行插入和查詢(其他操作簡略不寫) bookProject 應用A 看一下目錄結構 Book_TABLE.java 關鍵點:private static final String BOOK_DB = "create

WebService手寫簡單案例:客戶端與服務端的資料互動

本篇部落格是模擬服務端釋出服務,客戶端模擬接收服務端的返回資料的一個簡單案例(客戶端輸入姓名,服務端根據客戶端輸入的姓名模糊查詢身份證的案例) 服務端釋出服務 1.專案準備工作:新建一個web專案,匯入mysql的jar包放入工程,寫好jdbc連線,寫好實體類,寫dao,不同的

[Android]高效能MMKV資料互動分析-MMKV初始化

大家好,我係蒼王。 以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。 [Android]如何做一個崩潰率少於千分之三噶應用app--章節列表 元件化群1已經滿員,進來的可以加群2 763094035 MMKV框架初始化 MMKV.initiali

前後端資料互動,axios和jquery ajax的區別

axios作為Vue生態系統中濃墨重彩的一筆,我學習這個東西也是花了一定的時間的。剛開始的時候,也是遇到了很多問題。 逐漸摸透了它的脾氣。 首先說說FormData和Payload兩種資料格式的區別: 先是提交一個FormData的請求試試看: 然後我們看後端: 然後

springmvc之json資料互動

json資料格式在介面呼叫中,html頁面中較常用,json格式比較簡單,解析還比較方便。  springmvc進行json資料互動   為什麼要用json資料進行解析 最終輸出json資料,為了方便在前端介面對請求結果進行解析。 1、請求json、輸出jso

json資料互動

springmvc 的json資料互動 - 哎幽的成長 - CSDN部落格--和老師講課相同 http://blog.csdn.net/u012373815/article/details/47208187 ----------------- 1 json資料互動 &n