中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AngularJS(三)——在多個AngularJS controller之間共享數據

發布時間:2020-06-15 12:16:13 來源:網絡 閱讀:7009 作者:細桶假狗屎 欄目:開發技術

MVC中,為了方便維護,針對不同業務會使用不同的controller。有時我們需要在不同的controller中共享數據,本文旨在解決這一問題。

1. 使用$rootScope直接綁定

AngularJS中有一個$rootScope對象,它是AngularJS中最接近全局作用域的對象,是所有$scope對象的最上層,可以簡單理解為BOM中的window對象或Node.js中的global對象。最簡單的方式是直接將要共享的數據綁定到$rootScope對象中:

<!DOCTYPE html>
<html ng-app="exampleApp">
<head>
    <meta charset="utf-8">
    <title>Share Between Ctrls</title>
    <script src="lib/angular.js"></script>
    <link href="css/bootstrap.min.css" rel="stylesheet" />
    <link rel="stylesheet" href="css/bootstrap-responsive.min.css">
    <script>
        var app = angular.module("exampleApp", []);
        app.controller("FirstController", function($rootScope, $scope) {
            $scope.shareObject = function (obj) {
                $rootScope.person = obj || {};
            };
        });

        app.controller("SecondController", function($rootScope, $scope) {
            $scope.reportData = function() {
                var reportString = "",
                    person = $rootScope.person || {};
                for(var i in person) {
                    reportString += "person's " + i + " is " + person[i] + "\n";
                }
                alert(reportString);
            };
        });
    </script>
</head>
<body>
    <div class="well" ng-controller="FirstController">
        <input type="text" ng-model="person.name" placeholder="Input Your Name" />
        <input type="text" ng-model="person.age" placeholder="Input Your Age" />
        <input type="text" ng-model="person.sex" placeholder="Input Your Sex" />
        <button class="btn btn-primary" ng-click="shareObject(person)">Share Data</button>
    </div>
    <div class="well" ng-controller="SecondController">
        <button class="btn btn-primary" ng-click="reportData()">Report Data</button>
    </div>
</body>
</html>

整個效果如圖-1 ~ 圖-4所示:

AngularJS(三)——在多個AngularJS controller之間共享數據

圖-1 頁面加載完畢

AngularJS(三)——在多個AngularJS controller之間共享數據

圖-2 第一次點擊"Report Data"按鈕

AngularJS(三)——在多個AngularJS controller之間共享數據

圖-3 填寫信息,點擊"Share Data"按鈕

AngularJS(三)——在多個AngularJS controller之間共享數據

圖-4 再次點擊"Report Data"按鈕

這樣做解決了問題,在需要共享的數據量較少時可以采用,但因為會污染全局作用域,因此十分不推薦使用這種方法。

2. 使用service共享數據

...
<script>
    var app = angular.module("exampleApp", []);
    //需要將DataShareService注入
    app.controller("FirstController", function($scope, DataShareService) {
        $scope.person = {};
        $scope.shareObject = function (obj) {
            //賦值
            DataShareService.shareObject = obj;
        };
    });

    //需要將DataShareService注入
    app.controller("SecondController", function($scope, DataShareService) {
        var person = {};
        $scope.reportData = function() {
            var reportString = "",
                person = DataShareService.shareObject; //取值
            for(var i in person) {
                reportString += "person's " + i + " is " + person[i] + "\n";
            }
            alert(reportString);
        };
    });

    //自定義service,在多個controller之間共享數據
    app.service("DataShareService", function() {
        //無需定義其他變量,無需return,如果使用factory()則至少需要return一個空對象
    });
    <!-- 
         這里的
         app.factory()
         可以替換為
         app.constant()
         app.value()
         app.service()
     -->
</script>
...

最終實現的效果和使用$rootScope直接綁定完全相同,優點是解決了全局作用域被污染問題。有關最后app.factory()的替換問題可以參考之前的一篇博客,使用AngularJS自定義service,有興趣的讀者可以自己試驗一下。

3. 使用$scope事件機制

$scope可以向其他$scope廣播或發送事件,其他$scope監聽事件并處理,從而實現通信,也就是說可以通過$scope事件機制實現不同controller之間的數據共享。$scope事件機制包括以下三種方法:

AngularJS(三)——在多個AngularJS controller之間共享數據

表-1 有關$scope事件機制的三個方法

其中,$broadcast(name, args)為父級$scope向子級$scope發送事件,$emit(name, args)為子級$scope向父級$scope發送事件,$on(name, handler)為監聽事件的函數,handler參數為對事件進行處理的函數,該函數包含兩個參數:event和args,分別為事件對象和發送事件時傳遞的args參數。

這里我們不存在controller的嵌套,所有的$scope為同級,需要使用“祖宗級”$rootScope進行廣播。有關controller嵌套和繼承的問題會在之后的博文中講到。

使用$scope事件機制處理數據共享的JS代碼如下所示,由于HTML代碼與之前相同,故省略:

...
<script>
    var app = angular.module("exampleApp", []);
    app.controller("FirstController", function($rootScope, $scope) {
        $scope.person = {};
        $scope.shareObject = function (obj) {
            obj = obj || {};
            //將事件以"ShareObjectEvent"為名進行廣播
            $rootScope.$broadcast("ShareObjectEvent", obj);
        };
    });

    app.controller("SecondController", function($scope) {
        //監聽"ShareObjectEvent"事件
        $scope.$on("ShareObjectEvent", function(event, args) {
            person = args;
        });
        $scope.reportData = function() {
            var reportString = "";
            for(var i in person) {
                reportString += "person's " + i + " is " + person[i] + "\n";
            }
            alert(reportString);
        };
    });
</script>
...

最終實現的效果和使用$rootScope直接綁定完全相同。

最后需要補充的一點是,使用$scope事件機制與前兩種方法相比有著實時性的優勢,即數據的變化能夠及時被響應,如果想在使用前兩種方法時達到監聽數據變化實時響應的效果,需要用到AngularJS的$watch$watchCollection功能,詳情請參考這里。

完。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平度市| 根河市| 宝丰县| 石家庄市| 灵寿县| 鸡西市| 西城区| 思茅市| 开原市| 东阳市| 双桥区| 苏尼特左旗| 溆浦县| 兴隆县| 东阿县| 弥勒县| 天气| 永嘉县| 永修县| 靖西县| 和静县| 肃北| 尖扎县| 台东市| 娱乐| 辽宁省| 股票| 乐山市| 鹤山市| 昭觉县| 东明县| 嵊州市| 错那县| 三穗县| 三明市| 仪征市| 浪卡子县| 老河口市| 青河县| 云霄县| 凭祥市|