Angular 父子作用域之間交互($on、$emit和$broadcast)

Angular 控制器中的 $scope 在各作用域之間遵循 JS 的對(duì)象原型繼承方式
當(dāng)子作用域中沒(méi)有該對(duì)象時(shí)塞颁,默認(rèn)向上(父作用域)尋找过咬;子作用域有該對(duì)象時(shí)大渤,使用子作用域?qū)ο蟆?/p>

注:這里的父作用域包含直接父級(jí)和祖先,子作用域包含直接子級(jí)和更下層級(jí)

例如掸绞,HTML如下:

<body ng-app="myApp">
    <div ng-controller="fatherCtrl">
        <input type="text" ng-model="name" ng-change="nameOnChange()">
        <h1>Father: {{name}}!</h1>
        <div ng-controller="sonCtrl">
             <input type="text" ng-model="name" ng-change="nameOnChange()"> 
             <h1>Son: {{name}}</h1>
        </div>
    </div>
</body>

fatherCtrl 和 sonCtrl 里都使用了 name

sonCtrl 里沒(méi)有定義 name

var app = angular.module ('myApp', []);
app.controller('fatherCtrl', function ($scope) {
    $scope.name = "father";
});
app.controller('sonCtrl', function ($scope) {
    
});

這時(shí)改變 sonCtrl 直接讀取 fatherCtrl 中的 name

0001.gif

sonCtrl 里定義了 name

var app = angular.module ('myApp', []);
app.controller('fatherCtrl', function ($scope) {
    $scope.name = "father";
});
app.controller('sonCtrl', function ($scope) {
     $scope.name = "son";
});

這時(shí) sonCtrl 和 fatherCtrl 中的 name 互相不影響

0002.gif

如果想讓不同作用域之間的數(shù)據(jù)互相傳遞泵三,就需要用到事件系統(tǒng)里的 $on、$emit和$broadcast衔掸。
簡(jiǎn)單來(lái)說(shuō) :

  • $on
    用于監(jiān)聽(tīng)事件
  • $emit
    用于向上分發(fā)(子作用域向父作用域)
  • $broadcast
    用于向下廣播(父作用域向子作用域)

向上分發(fā)

var app = angular.module ('myApp', []);
app.controller('fatherCtrl', function ($scope) {
    $scope.name = "father";
    $scope.$on ('test', function(e, newName) {
        $scope.name = newName;
    });
});
app.controller('sonCtrl', function ($scope) {
    $scope.name = "son";
    $scope.nameOnChange = function () {
        $scope.$emit ('test', $scope.name);
    }
});

sonCtrl 中 nameOnChange 函數(shù)調(diào)用 $emit 事件烫幕,向上分發(fā) $scope.name
fatherCtrl 中 $on 事件監(jiān)聽(tīng)到結(jié)果,修改$scope.name 的值
在修改 sonCtrl 的 name 時(shí)敞映,fatherCtrl 的 name 隨之改變较曼,但修改 fatherCtrl 的 name 時(shí) sonCtrl 的 name 不變化

0003.gif

向下廣播

var app = angular.module ('myApp', []);
app.controller('fatherCtrl', function ($scope) {
    $scope.name = "father";
    $scope.nameOnChange = function () {
        $scope.$broadcast ('test', $scope.name);
    }
});
app.controller('sonCtrl', function ($scope) {
    $scope.name = "son";
    $scope.$on ('test', function(e, newName) {
        $scope.name = newName;
    });
    $scope.nameOnChange = function () {
        // $scope.$emit ('test', $scope.name);
    }
});

與向上分發(fā)效果相反
fatherCtrl 中 nameOnChange 函數(shù)調(diào)用 $broadcast 事件,向下廣播 $scope.name
sonCtrl 中 $on 事件監(jiān)聽(tīng)到結(jié)果振愿,修改$scope.name 的值
在修改 fatherCtrl 的 name 時(shí)捷犹,sonCtrl 的 name 隨之改變弛饭,但修改 sonCtrl 的 name 時(shí) fatherCtrl 的 name 不變化
注:這里在 sonCtrl 里也需要定義 nameOnChange ,否則會(huì)默認(rèn)調(diào)用父級(jí)的

0004.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伏恐,一起剝皮案震驚了整個(gè)濱河市孩哑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠桦,老刑警劉巖横蜒,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異销凑,居然都是意外死亡丛晌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)斗幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澎蛛,“玉大人,你說(shuō)我怎么就攤上這事蜕窿∧甭撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵桐经,是天一觀的道長(zhǎng)毁兆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阴挣,這世上最難降的妖魔是什么气堕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮畔咧,結(jié)果婚禮上茎芭,老公的妹妹穿的比我還像新娘。我一直安慰自己誓沸,他們只是感情好梅桩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拜隧,像睡著了一般摘投。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹蓄,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天犀呼,我揣著相機(jī)與錄音,去河邊找鬼薇组。 笑死外臂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的律胀。 我是一名探鬼主播宋光,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼貌矿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了罪佳?” 一聲冷哼從身側(cè)響起逛漫,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赘艳,沒(méi)想到半個(gè)月后酌毡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾管,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年枷踏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰曾。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旭蠕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旷坦,到底是詐尸還是另有隱情掏熬,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布秒梅,位于F島的核電站旗芬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏番电。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一辆琅、第九天 我趴在偏房一處隱蔽的房頂上張望漱办。 院中可真熱鬧,春花似錦婉烟、人聲如沸娩井。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洞辣。三九已至,卻和暖如春昙衅,著一層夾襖步出監(jiān)牢的瞬間扬霜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工而涉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留著瓶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓啼县,卻偏偏與公主長(zhǎng)得像材原,于是被迫代替她去往敵國(guó)和親沸久。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 這是一個(gè)面試官問(wèn)我的題目,當(dāng)時(shí)沒(méi)回答出來(lái)威酒,主要是項(xiàng)目中沒(méi)有碰到過(guò)這類(lèi)問(wèn)題窑睁,因此今天整理下查找到的資料,希望對(duì)大家有...
    一木_qintb閱讀 744評(píng)論 0 2
  • 1.類(lèi)庫(kù)( 提供類(lèi)方法 ) 和框架 類(lèi)庫(kù)提供一系列的函數(shù)和方法的合集兼搏,能夠加快你寫(xiě)代碼的速度卵慰。但是主導(dǎo)邏輯的還是自...
    w_zhuan閱讀 1,792評(píng)論 0 8
  • Angular按照發(fā)布/訂閱模式設(shè)計(jì)了其事件系統(tǒng)裳朋,使用時(shí)需要“發(fā)布”事件,并在適當(dāng)?shù)奈恢谩坝嗛啞被颉巴擞啞笔录胖?..
    鹿守心畔光閱讀 1,056評(píng)論 0 2
  • 2013年8月2日鲤嫡, 嚴(yán)清 譯譯文:理解AngularJS的作用域Scope原文:Understanding Sc...
    竿牘閱讀 368評(píng)論 0 0
  • 今夜 又一次山與水重疊 寂靜如一泓湖水 月光清冷 我落筆 一場(chǎng)花事 隱秘開(kāi)在心底處的 不止是百合 還有蝴蝶蘭 淡藍(lán)...
    shufan書(shū)凡閱讀 282評(píng)論 0 1