成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【轉(zhuǎn)】angularJS的兄弟controller之間如何正確的通信

forsigner / 2883人閱讀

摘要:每個(gè)的指向指向父級作用域。之間的通信本質(zhì)上是當(dāng)前的所在的如何跟其他上的進(jìn)行通信。傳遞事件有種方式觸發(fā)的事件要通知整個(gè)事件系統(tǒng)允許任意作用域處理這個(gè)事件就要向下傳播。作用域上使用進(jìn)行事件監(jiān)聽。示例關(guān)于同級之間通信我的一個(gè)提問

原文鏈接:http://www.cnblogs.com/webbes...

AngularJS中的controller是個(gè)函數(shù),用來向視圖的作用域($scope)添加額外的功能,我們用它來給作用域?qū)ο笤O(shè)置初始狀態(tài),并添加自定義行為。

當(dāng)我們在創(chuàng)建新的控制器時(shí),angularJS會幫我們生成并傳遞一個(gè)新的$scope對象給這個(gè)controller,在angularJS應(yīng)用的中的任何一個(gè)部分,都有父級作用域的存在,頂級就是ng-app所在的層級,它的父級作用域就是$rootScope。

每個(gè)$scope的$root指向$rootScope, $cope.$parent指向父級作用域。

cotroller之間的通信本質(zhì)上是當(dāng)前的controller所在的$scope如何跟其他controller上的$scope進(jìn)行通信。

通常有3中解決方式:

利用作用域繼承的原理,子控制器訪問父級控制器中的內(nèi)容。
使用angularJS中的事件,也就是使用$on,$emit,$broadcast進(jìn)行消息傳遞
使用angularJS中的服務(wù)

第一種方式

即作用域嵌套作用域,有一定的使用限制,需要作用域嵌套起來,在實(shí)際開發(fā)中這種場景相對比較少,但也不是沒有,這種方式更簡單直接。

angularJS中默認(rèn)情況下,當(dāng)前作用域中無法找到某個(gè)屬性時(shí),就會在父級作用域中進(jìn)行查找,若找不到直至查找到$rootScope。 如果在$rootScope中也無法找到程序依舊運(yùn)行,但視圖不會更新。

示例

JavaScript

//Javascript

    app.controller("ParentController", function($scope) { 

        $scope.person = {greeted: false};

    });

    app.controller("ChildController", function($scope) {

        $scope.sayHello = function() {

             $scope.person.name = "Ari Lerner";

        };

    });

    //HTML

     
{{ person }}
//result {"greeted":true, "name": "Ari Lerner"}

第二種方式

因?yàn)樽饔糜蚴怯袑哟蔚?,所以可以利用作用域鏈傳遞事件。

傳遞事件有2種方式: $broadcast: 觸發(fā)的事件要通知整個(gè)事件系統(tǒng)(允許任意作用域處理這個(gè)事件)就要向下傳播。 $emit: 如果要提醒一個(gè)全局模塊,需要通知更高層次的作用域時(shí)(例如$rootscope)需要把事件向上傳遞。

作用域上使用$on進(jìn)行事件監(jiān)聽。

示例

JavaScript

app.controller("ParentController", function($scope) { 
        $scope.$on("$fromSubControllerClick", function(e,data){
            console.log(data); // hello
        });
    });

    app.controller("ChildController", function($scope) {
        $scope.sayHello = function() {
            $scope.$emit("$fromSubControllerClick","hello");
        };
    });

    //HTML
     
     

在這里想要說的另外一個(gè)問題就是事件傳播的性能問題,$broadcast+$on的方式回通知所有的子作用域,這里就會有性能問題,所以推薦使用$emit+$on的方式,為了進(jìn)一步提升性能,定義的事件處理函數(shù)要在作用域銷毀時(shí)一起釋放掉。

使用$emit+$on的方式需要我們將事件監(jiān)聽綁定在$rootScope上,例如:

JavaScript

angular
    .module("MyApp")
    .controller("MyController", ["$scope", "$rootScope", function MyController($scope, $rootScope) {
            var unbind = $rootScope.$on("someComponent.someCrazyEvent", function(){
                console.log("foo");
            });
            $scope.$on("$destroy", unbind);
        }
    ]);

但是這種方式有點(diǎn)繁瑣,定義多個(gè)事件處理函數(shù)時(shí)整個(gè)人都不好了,所以我們來改進(jìn)一下

利用裝飾器來定義一個(gè)新的事件綁定函數(shù):

JavaScript

angular
    .module("MyApp")
    .config(["$provide", function($provide){
        $provide.decorator("$rootScope", ["$delegate", function($delegate){
            Object.defineProperty($delegate.constructor.prototype, "$onRootScope", {
                value: function(name, listener){
                    var unsubscribe = $delegate.$on(name, listener);
                    this.$on("$destroy", unsubscribe);
                    return unsubscribe;
                },
                enumerable: false
            });
            return $delegate;
        }]);
    }]);

那么我們在控制器中定義事件處理函數(shù)時(shí):

JavaScript

angular
    .module("MyApp")
    .controller("MyController", ["$scope", function MyController($scope) {
            $scope.$onRootScope("someComponent.someCrazyEvent", function(){
                console.log("foo");
            });
        }
    ]);
    

第三種方式

利用angularJS中service單例模式的特性,服務(wù)(service)提供了一種能在應(yīng)用的整個(gè)生命周期內(nèi)保持?jǐn)?shù)據(jù)的方式,能夠在控制器之間進(jìn)行通信,且能保證數(shù)據(jù)的一致性。

一般我們都會封裝server來為應(yīng)用提供訪問數(shù)據(jù)的接口,或者跟遠(yuǎn)程進(jìn)行數(shù)據(jù)交互。

示例

JavaScript

var myApp = angular.module("myApp", []);
myApp.factory("Data", function() {
  return {
    name: "Ting"
  }
});

myApp.controller("FirstCtrl", function($scope, Data) {
  $scope.data = Data;
  $scope.setName = function() {
    Data.name = "Jack";
  }
});

myApp.controller("SecondCtrl", function($scope, Data) {
  $scope.data = Data;
  $scope.setName = function() {
    Data.name = "Moby";
  }
});

關(guān)于同級controller之間通信我的一個(gè)提問:https://segmentfault.com/q/10...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84489.html

相關(guān)文章

  • 使用AngularJS構(gòu)建應(yīng)用時(shí)遇到問題及解決方案(版本為1.3.9)

    摘要:最近在公司使用用完成了一個(gè)項(xiàng)目,在此記錄一下過程中遇到的問題及解決方案。其他兩種方法可參考站內(nèi)文章控制器如何通信結(jié)語以上為我在編寫一個(gè)應(yīng)用時(shí)遇到的問題及解決方案,記錄并分享出來,歡迎大家指正 最近在公司使用用AngularJS(1.3.9)完成了一個(gè)項(xiàng)目,在此記錄一下過程中遇到的問題及解決方案。 使用$http服務(wù)發(fā)送ajax請求時(shí)后端無法判斷請求是XMLHttpRequest 問題...

    cuieney 評論0 收藏0
  • AngularJS簡述

    流行框架 簡介 angularjs是一款非常優(yōu)秀的前端高級JS框架,由谷歌團(tuán)隊(duì)開發(fā)維護(hù),能夠快速構(gòu)建單頁web應(yīng)用,化繁為簡 無論是angularjs還是jQuery都是用原生JS封裝的 庫:對代碼進(jìn)行封裝,調(diào)用封裝的方法,簡化操作 傳統(tǒng)方式是用get方式獲取元素,然后點(diǎn)方法 jQuery庫實(shí)現(xiàn)了對獲取方式的封裝,對方法的封裝 框架:提供代碼書寫規(guī)則,按照規(guī)則去寫代碼,框架會幫我們實(shí)現(xiàn)響應(yīng)的功能...

    Jason 評論0 收藏0
  • vue面試

    摘要:雖然計(jì)算屬性在大多數(shù)情況下更合適,但有時(shí)也需要一個(gè)自定義的偵聽器,當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開銷較大的操作時(shí),通過偵聽器最有用。路由的鉤子函數(shù)首頁可以控制導(dǎo)航跳轉(zhuǎn),,等,一般用于頁面的修改。 談?wù)勀銓VVM開發(fā)模式的理解 MVVM分為Model、View、ViewModel三者。Model 代表數(shù)據(jù)模型,數(shù)據(jù)和業(yè)務(wù)邏輯都在Model層中定義;View 代表UI視圖,負(fù)責(zé)數(shù)據(jù)的展示;...

    vspiders 評論0 收藏0
  • AngularJs功能(九)--路由

    摘要:該內(nèi)的內(nèi)容會根據(jù)路由的變化而變化。配置,用來定義路由規(guī)則。由此我們就需要另一個(gè)第三方路由模塊,叫做,當(dāng)然它是基于開發(fā)的。造成這種現(xiàn)象的最根本原因路由沒有明確的父子層級關(guān)系。監(jiān)聽路由路由狀態(tài)發(fā)生改變時(shí)可以通過監(jiān)聽,通過注入實(shí)現(xiàn)狀態(tài)的管理。 何為路由 路由機(jī)制運(yùn)可以實(shí)現(xiàn)多視圖的單頁Web應(yīng)用(single page web application,SPA)。 單頁應(yīng)用在使用期間不會重新加載...

    mingde 評論0 收藏0
  • 創(chuàng)建自定義指令

    摘要:我們通常通過其區(qū)分大小寫的規(guī)范化名稱例如,來定義指令。在其目前的實(shí)現(xiàn)上,我們應(yīng)該需要去創(chuàng)建一些不同點(diǎn)控制器用來重用這個(gè)指令。如此,綁定是理想的將回調(diào)函數(shù)綁定到指令行為。這被指令調(diào)用指明。前綴表示該指令在其父元素上搜索控制 文檔翻譯至angularjs.org. 文檔解釋了您何時(shí)想在AngularJS應(yīng)用程序中創(chuàng)建自己的指令,以及如何實(shí)現(xiàn)它們。 | 建議搭配原文食用 | 什么是指令? 在...

    zzbo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<