angular之$broadcast、$emit、$on傳值

来源:http://www.cnblogs.com/puyongsong/archive/2017/05/13/6805620.html
-Advertisement-
Play Games

文件層級 index.html <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, ...


文件層級

 

index.html

<!DOCTYPE html>
<html ng-app="nickApp">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title>angular之$broadcast、$emit、$on傳值</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-ui-router/0.2.15/angular-ui-router.min.js"></script>
    <script src="js/route.js"></script>
    <script src="js/app.js"></script>
    <script src="js/service/PublicDataService.js"></script>
</head>
<body ng-controller="bodyCtl">

<button ng-click="goHome()">go home</button>
<button ng-click="goMain()">$state go main</button>
<a ui-sref="main({paramsData:'ui-sref'})">ui-sref go main</a>
<div ui-view></div>

<h2>$emit $broadcast $on</h2>

<div ng-controller="ParentCtrl">                <!--父級-->
    <div ng-controller="SelfCtrl">              <!--自己-->
        <button class="btn" ng-click="click()">click me</button>
        <div ng-controller="ChildCtrl"></div>   <!--子級-->
    </div>
    <div ng-controller="BroCtrl"></div>         <!--平級-->
</div>

</body>
</html>
View Code

templates - home.html

<h2>home</h2>
<button ng-click="goMain()">$state go main</button>
View Code

templates - main.html

<h2>main</h2>
View Code

js - route.js

var nickApp = angular.module('nickApp', ['ui.router'])
    .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
        $urlRouterProvider.otherwise('/home');

        $stateProvider
            .state('home', {
                url: '/home',
                templateUrl: 'templates/home.html',
                controller: 'HomeCtl',
                //params: {paramsData: null}
                navButtons:[] //自定義一些參數 在controll通過$state.get('home')得到對象
            })

            .state('main', {
                url: '/main',
                templateUrl: 'templates/main.html',
                controller: 'MainCtl',
                params: {paramsData: null} //目標頁面定義接收的參數prameData
            })

    }])
View Code

js - app.js

nickApp
    .controller('bodyCtl', ['$state', '$scope', function ($state, $scope) {
        $scope.goMain = function () {
            $state.go('main', {paramsData: 'body go main'});//傳參時參數一致prameData--目標頁路由配置params:{paramsData: null}
        };

        $scope.goHome = function () {
            $state.go('home', {paramsData: 'home page'});//目標頁路由未配置params則$stateParams 為空
        };

        $scope.data = 'body data';

        console.log($scope.data);

        console.log($scope.homeData);//父無法用子scope homeData 使用方法傳值接收 $on $emit $broadcast


    }])

    .controller('HomeCtl', ['$scope', '$state', '$stateParams', function ($scope, $state, $stateParams) {
        $scope.goMain = function () {
            $state.go('main', {param: 'home go main'});//不一致 $stateParams 接收不到則為目標頁面定義接收的參數{paramsData: null}
        };

        console.log($stateParams);

        console.log($scope.data);//子用父scope data

        $scope.homeData = 'home data';
        console.log($scope.homeData);

        console.log($state.get('home'));
        console.log($state.get('main'));

    }])

    .controller('MainCtl', ['$scope', '$stateParams', function ($scope, $stateParams) {

        console.log($stateParams);

        console.log($scope.data);//子用父scope data


    }])

    //$emit 子向父 controller 傳 event、data -- $broadcast 父傳子 -- $on 接收

    .controller('SelfCtrl', ['$scope', 'PublicDataService', function ($scope, PublicDataService) {
        $scope.click = function () {
            $scope.$broadcast('to-child', 'to-child data'); //父傳子
            $scope.$emit('to-parent', 'to-parent data'); //子傳父
        };

        $scope.publicData = PublicDataService.publicData;
        console.log($scope.publicData);
    }])

    .controller('ParentCtrl', ['$scope', 'PublicDataService', function ($scope, PublicDataService) {
        $scope.$on('to-parent', function (event, data) {
            console.log('ParentCtrl--' + data);       //父controller能得到傳給父級值
        });
        $scope.$on('to-child', function (event, data) {
            console.log('ParentCtrl--' + data);       //父controller得不到傳給子級值
        });

        $scope.publicData = PublicDataService.publicData;
        console.log($scope.publicData);
    }])

    .controller('ChildCtrl', ['$scope', 'PublicDataService', function ($scope, PublicDataService) {
        $scope.$on('to-child', function (event, data) {
            console.log('ChildCtrl--' + data);         //子controller能得到傳給子級值
        });
        $scope.$on('to-parent', function (event, data) {
            console.log('ChildCtrl--' + data);         //子controller得不到傳給父級值
        });

        $scope.publicData = PublicDataService.publicData;
        console.log($scope.publicData);
    }])

    /*
     平級得不到值 解決辦法
     *用上面的$state.go()
     *或者定義一個公共服務 PublicDataService 註入 controller 就可以使用了
     *或 在配置路由時自定義一些參數 在controll--HomeCtl通過$state.get('home')得到一個對象,它包含了配置home頁的路由參數
     */

    .controller('BroCtrl', ['$scope', 'PublicDataService', function ($scope, PublicDataService) {
        $scope.$on('to-parent', function (event, data) {
            console.log('BroCtrl', data);          //平級得不到值
        });
        $scope.$on('to-child', function (event, data) {
            console.log('BroCtrl', data);          //平級得不到值
        });

        $scope.publicData = PublicDataService.publicData;
        console.log($scope.publicData);
    }])
View Code

js - service - PublicDataService.js

nickApp
    .factory('PublicDataService', [function () {
        var publicData = 'public service data';

        return {
            publicData: publicData
        }

    }])
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文為轉載文章,文章來自:王輝|十億級視頻播放技術優化揭密 QCon是由InfoQ主辦的全球頂級技術盛會,每年在倫敦、北京、東京、紐約、聖保羅、上海、舊金山召開。自 2007年 3月份首次舉辦以來,已經有超萬名高級技術人員參加過QCon大會。QCon內容源於實踐並面向社區,演講嘉賓依據熱點話題,面向 ...
  • 無論是jquery還是zepto,都離不開$,這個符號似乎是萬能的,這篇文章通過zepto源碼來探究的就是$實現的原理。 ...
  • 原文:12 Extremely Useful Hacks for JavaScript 作者:Caio Ribeiro Pereira 翻譯:雁驚寒 ...
  • 1.Vuejs組件 這裡註意一點,組件要先註冊再使用,也就是說 如果反過來會報錯,因為反過來代表先使用了組件的,但是組件卻沒註冊。 webpack報錯後,使用webpack --display-error-details可以排錯 2.指令keep-alive 在看demo的時候看到在vue-rout ...
  • 新公司已經呆了一個多月,目前著手一個數據可視化的項目,數據可視化肯定要用到圖形庫如 、 、 、 等,經決定我的這個項目用阿裡旗下螞蟻金服所開發的 圖表庫。 官方地址:https://antv.alipay.com/g2/doc/index.html Github:https://github.com ...
  • 一、jQuery 提供開發者開發插件的幾種模式 1.$.extend(); //這個方法是綁定在$上面的。可以通過$直接調用 2.$.fn.方法名 //這個方法是綁定在Dom對象上面的可以通過$('').方法名();調用 3.$.widget //通過jQuery UI 部件工廠模式創建。 二、插件 ...
  • 關於CSS3的3D立方體動畫 知識點: 1、每個元素有獨立的坐標系 2、坐標系隨當前元素的改變而發生改變 3、立方體由靜態transform參數構成 4、通過給容器添加動畫使立方體運動 效果圖: ...
  • 前面的話 Nodejs的模塊是基於CommonJS規範實現的,可不可以應用在瀏覽器環境中呢? 第二行math.add(2, 3),在第一行require('math')之後運行,因此必須等math.js載入完成。也就是說,如果載入時間很長,整個應用就會停在那裡等。這對伺服器端不是一個問題,因為所有的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...