angularjs 中的scope繼承關系——(2)

轉自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html

angularjs 中的scope繼承關系

ng-include

假設在我們的 controller 中,

$scope.myPrimitive = 50;
$scope.myObject    = {aNumber: 11};

HTML 為:

<script type="text/ng-template" id="/tpl1.html"><input ng-model="myPrimitive">
</script>
<div ng-include src="'/tpl1.html'"></div><script type="text/ng-template" id="/tpl2.html"><input ng-model="myObject.aNumber">
</script>
<div ng-include src="'/tpl2.html'"></div>

每一個 ng-include 會生成一個子 Scope,每個子 Scope 都繼承父 Scope。

angularjs-inheritance6

輸入(比如”77″)到第一個 input 文本框,則子 Scope 將獲得一個新的 myPrimitive 屬性,覆蓋掉父 Scope 的同名屬性。這可能和你預想的不一樣。

angularjs-inheritance7

輸入(比如”99″)到第二個 input 文本框,并不會在子 Scope 創建新的屬性,因為 tpl2.html 將 model 綁定到了一個對象屬性(an object property),原型繼承在這時發揮了作用,ngModel 尋找對象 myObject 并且在它的父 Scope 中找到了。

angularjs-inheritance8

如果我們不想把 model 從 number 基礎類型改為對象,我們可以用 $parent 改寫第一個模板:

<input ng-model="$parent.myPrimitive">

輸入(比如”22″)到這個文本框也不會創建新屬性了。model 被綁定到了父 scope 的屬性上(因為 $parent 是子 Scope 指向它的父 Scope 的一個屬性)。

angularjs-inheritance9

對于所有的 scope (原型繼承的或者非繼承的),Angular 總是會通過 Scope 的 $parent, $$childHead 和 $$childTail 屬性記錄父-子關系(也就是繼承關系),圖中為簡化而未畫出這些屬性。

在沒有表單元素的情況下,另一種方法是在父 Scope 中定義一個函數來修改基本數據類型。因為有原型繼承,子 Scope 確保能夠調用這個函數。例如,

// 父 Scope 中
$scope.setMyPrimitive = function(value) {$scope.myPrimitive = value;
}

查看 DEMO。參考?StackOverflow。

ng-switch

ng-switch 的原型繼承和 ng-include 一樣。所以如果你需要對基本類型數據進行雙向綁定,使用 $parent,或者將其改為 object 對象并綁定到對象的屬性,防止子 Scope 覆蓋父 Scope 的屬性。

參考?AngularJS, bind scope of a switch-case?

ng-repeat

ng-repeat 有一點不一樣。假設在我們的 controller 里:

$scope.myArrayOfPrimitives = [ 11, 22 ];
$scope.myArrayOfObjects    = [{num: 101}, {num: 202}]

還有 HTML:

<ul><li ng-repeat="num in myArrayOfPrimitives"><input ng-model="num"></li>
<ul>
<ul><li ng-repeat="obj in myArrayOfObjects"><input ng-model="obj.num"></li>
<ul>

對于每一個 Item,ng-repeat 創建新的 Scope,每一個 Scope 都繼承父 Scope,但同時 item 的值也被賦給了新 Scope 的新屬性(新屬性的名字為循環的變量名)。Angular ng-repeat 的源碼實際上是這樣的:

childScope = scope.$new(); // 子 scope 原型繼承父 scope ...     
childScope[valueIdent] = value; // 創建新的 childScope 屬性

如果 item 是一個基礎數據類型(就像 myArrayOfPrimitives),本質上它的值被復制了一份賦給了新的子 scope 屬性。改變這個子 scope 屬性值(比如用 ng-model,即?num)不會改變父 scope 引用的 array。所以上面第一個 ng-repeat 里每一個子 scope 獲得的?num?屬性獨立于 myArrayOfPrimitives 數組:

angularjs-inheritance10

這樣的 ng-repeat 和你預想中的不一樣。在 Angular 1.0.2 及更早的版本,向文本框中輸入會改變灰色格子的值,它們只在子 Scope 中可見。Angular 1.0.3+ 以后,輸入文本不會再有任何作用了。(參考StackOverflow 上的解釋)我們希望的是輸入能改變 myArrayOfPrimitives 數組,而不是子 Scope 里的屬性。為此我們必須將 model 改為一個關于對象的數組(array of objects)。

所以如果 item 是一個對象,則對于原對象的一個引用(而非拷貝)被賦給了新的子 Scope 屬性。改變子 Scope 屬性的值(使用 ng-model,即 obj.num)也就改變了父 Scope 所引用的對象。所以上面第二個 ng-repeat 可表示為:

angularjs-inheritance11

這才是我們想要的。輸入到文本框即會改變灰色格子的值,該值在父 Scope 和子 Scope 均可見。

總結

一共有四種 Scope:

  1. 普通進行原型繼承的 Scope —— ng-include, ng-switch, ng-controller, directive with?scope: true
  2. 普通原型繼承的 Scope 但拷貝賦值 —— ng-repeat。 每個 ng-repeat 的循環都創建新的子 Scope,并且子 Scope 總是獲得新的屬性。
  3. 獨立的 isolate scope —— directive with?scope: {...}。它不是原型繼承,但 ‘=’, ‘@’ 和 ‘&’ 提供了訪問父 Scope 屬性的機制。
  4. transcluded scope —— directive with?transclude: true。它也遵循原型繼承,但它同時是任何 isolate scope 的兄弟。

對于所有的 Scope,Angular 總是會通過 Scope 的 $parent, $$childHead 和 $$childTail 屬性記錄父-子關系。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# DatatTable某一列是否有重復判斷

public bool HasRepeatData(DataTable dt,string[] colName) { bool flagfalse; DataView myDataView new DataView(dt); if (myDataView.ToTable(true, colName).Rows.Count < dt.Rows.Count) { flag true; } return flag; }轉載于:https://www.cnblogs.com/clj0102/p/93…

cordova 項目添加splash啟動界面

需求&#xff1a;cordova項目啟動添加啟動界面&#xff0c;并在設備初始化完成后自動隱藏splash1.新建項目cordova create Mypro com.test.pro proName2.添加平臺cd Mypro&#xff08;進入目錄&#xff09;cordova platform add androidcordova platform add iOS3.添加splash插…

遼寧大學計算機專業接收調劑,目前有計算機專業調劑通知的學校,不斷更新—3月26日更新,新增遼寧大學等...

本帖最后由 yunnyforo 于 2012-3-26 21:16 編輯注&#xff1a;我對研究所關注度不高&#xff0c;關于研究所的調劑通知可能不及時&#xff0c;見諒。大家可以關注中國教育在線考研調劑信息站&#xff1a;http://kaoyan.eol.cn/html/ky/tiaoji/index.shtml&#xff0c;個人感覺這…

Android界面菜單(4)—快捷菜單

2019獨角獸企業重金招聘Python工程師標準>>> 快捷菜單 當用戶點擊界面上某個元素超過2秒后&#xff0c;將啟動注冊到該界面的快捷菜單。 步驟&#xff1a; 1.代碼動態生成菜單 final static int CONTEXT_MENU_1 Menu.FIRST;final static int CONTEXT_MENU_2 Menu…

Echarts地圖編寫

1.引入echarts庫文件 <script charset"utf-8" type"text/javascript" language"javascript" src"echarts-2.2.7/doc/example/www/js/echarts.js"></script> 2.在頁面中新建div用于地圖展示 <div id"main" st…

迷宮游戲 堆棧實現

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8stack <int *> s;int * createMaze(){//初始化迷宮int i,j;int * a;anew int[n*n];for(i0;i<n;i){for(j0;j<n;j){*(an*ij)-1;//不設置為0的原因是超過矩陣…

威海職業學院計算機專業宿舍,2021年威海職業學院新生宿舍條件和宿舍環境圖片...

每年高考結束后&#xff0c;威海職業學院新生被錄取同學們陸續都到校報到~而宿舍作為同學們朝夕相處之場所&#xff0c;如果不懂相處之道&#xff0c;難免會摩擦不斷&#xff0c;更有甚者堪比宮斗大戲。所以各位大學新生一定要珍惜室友之間的友情&#xff0c;彼此處好關系。本文…

PostgreSQL 函數調試、診斷、優化 auto_explain

PostgreSQL 函數調試 & auto_explain 作者 digoal 日期 2016-11-21 標簽 PostgreSQL , pldebugger , 函數調試 , auto_explain 背景 PostgreSQL的服務端編程能力比較強&#xff0c;不僅支持像java, R, python這種流行的編程語言&#xff0c;另外還內置了一個與Oracle plsql…

判斷請求來自手機還是PC

由于小程序和PC端用的是同一個后臺 所以就需要判斷請求是從哪里發過來的 在這里是利用Request Body 里面的user-agent 來判斷 /** * 根據當前請求的特征&#xff0c;判斷該請求是否來自手機終端&#xff0c;主要檢測特殊的頭信息&#xff0c;以及user-Agent這個header * * pa…

小旭的互聯網營銷之微信營銷

11月1日&#xff0c;一篇題為《什么樣的女黑客竟遭馬云強東在雙11聯手封殺?》的文章&#xff0c;借助雙11火熱的關注效應&#xff0c;在短短兩天時間內刷爆朋友圈。 該文章的女主角不僅外表靚麗&#xff0c;黑客技術更是驚艷&#xff1a;“作為美籍華人的Joanna在2015黑帽子會…

計算機專業錄取分數及大學排名,計算機專業錄取分數最高的大學有哪些?附排名前50大學名單...

高考結束之后&#xff0c;不少即將迎接高考的家長對于很多專業的錄取情況都抱有很大的興趣&#xff0c;都比較關心自己的理想專業大概能上哪些大學。今天&#xff0c;小編將為大家以山東高考計算機專業各大學錄取分數進行排名&#xff0c;供下一屆高考生參考。計算機專業作為近…

letsencrypt 自動續期不關閉nginx

為什么80%的碼農都做不了架構師&#xff1f;>>> 已失效 corntab -e 5 0 1 * * /opt/letsencrypt/letsencrypt-auto --config /etc/letsencrypt/webroot.ini -d <domain> certonly && sudo service nginx reload/etc/letsencrypt/webroot.ini rsa-key…

loss低但精確度低_低光照圖像增強網絡-RetinexNet(model.py解析【2】)

論文地址&#xff1a;https://arxiv.org/pdf/1808.04560.pdf代碼地址&#xff1a;https://github.com/weichen582/RetinexNet解析目錄&#xff1a;https://zhuanlan.zhihu.com/p/88761829整個模型架構被實現為一個類&#xff1a;class lowlight_enhance(object):其構造函數實現…

計算機應用發表論文,計算機應用論文發表.docx

計算機應用論文發表1在工程項目管理中應用計算機技術存在的問題計算機軟件是計算機運行的重要保障&#xff0c;一個好的計算機軟件直接決定計算機技術在工程項目管理的高效應用。但由于市場上計算機軟件種類繁多&#xff0c;質量好壞不一&#xff0c;質量好的價格高&#xff0c…

添加dubbo xsd的支持

使用dubbo時遇到問題&#xff1a; org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document http://code.alibabatech.com/schema/dubbo/dubbo.xsd, because 1) could not find the document; 2) the document could not be read; 3) the root ele…

byte數組穿換成pcm格式_形象地介紹DSD的編解碼原理及和PCM的區別

一直有人不清楚DSD到底是啥原理&#xff0c;和MP3, FLAC, APE, WAV等基于PCM編碼技術的音頻格式又有啥區別。特意做了兩張圖說明一下。圖一是是由很多黑點構成的蒙娜麗莎頭像&#xff0c;點擊看大圖就知道是沒有灰階只有黑白兩色。但是人眼是可以看到有豐富的灰階的。這和DSD一…

最大熵對應的概率分布

最大熵對應的概率分布 最大熵定理 設 \(X \sim p(x)\) 是一個連續型隨機變量&#xff0c;其微分熵定義為\[ h(X) - \int p(x)\log p(x) dx \]其中&#xff0c;\(\log\) 一般取自然對數 \(\ln\), 單位為 奈特&#xff08;nats&#xff09;。 考慮如下優化問題&#xff1a;\[ \b…

UBUNTU : Destination Host Unreachable

介紹我的系統的搭建的方式: WIN7 64 VMWARE STATION&#xff0c;方式是進行橋接的方式。最近突然出現了問題&#xff0c;Ubuntu ping 外網或者 PING WIN 7 的時候&#xff0c;出現 Destination Host Unreachable 的錯誤&#xff1b;想著去修改網卡的鏈接形式&#xff1a; 編輯…

焦作師范高等專科學校對口計算機分數線,焦作師范高等專科學校錄取分數線2018...

焦作師范高等專科學校錄取分數線20182018年 電子信息工程技術 理科 332 3602018年 物聯網應用技術 文科 391 4082018年 物聯網應用技術 理科 328 3692018年 學前教育 文科 388 4022018年 學前教育 理科 324 3512018年 移動應用開發 文科 02018年 移動應用開發 理科 305 3322018…

在Spring boot 配置過濾器(filter)

在spring boot 配置servlet filter 邏輯上與配置spring 是一樣的。 不過相比spring 更加簡化配置的難度。 這里只需要兩步1 創建一個自定義顧慮器并繼承spring filter 例如OncePerRequestFilterpublic class AuthenticationFilter extends OncePerRequestFilter{private final …