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

文件层级

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>

templates - home.html

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

templates - main.html

<h2>main</h2>

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
            })

    }])

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);
    }])

js - service - PublicDataService.js

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

        return {
            publicData: publicData
        }

    }])

时间: 2024-11-17 15:51:59

angular之$broadcast、$emit、$on传值的相关文章

AngularJS之ng-options的best practise

废话不多说,直接上代码. function MySelectCtrl($scope) { $scope.Model = [ { id: 10002, MainCategory: '男', ProductName: '水洗T恤', ProductColor: '黑' }, { id: 10004, MainCategory: '女', ProductName: 'V领短袖', ProductColor: '红' }, { id: 10006, MainCategory: '男', ProductN

angular之$on、$emit、$broadcast

1.$scope.$on view事件 //View被加载但是DOM树构建之前时: $scope.$on('$viewContentLoading', function(event, viewConfig){ ... }); //View被加载而且DOM树构建完成时: $scope.$on('$viewContentLoaded', function(event){ ... }); //路由路径发生改变时 current:要到达的路径  previous:上一个路径 $scope.$on('$l

Angular中父子组件双向绑定传值

下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输入框输入内容反映到父组件上,并且使用了@Output传值给父组件 下面是父组件的页面 父组件ts 子组件页面 子组件ts 我主要来说下需要注意的几个地方,第一个就是当我利用子组件的@Output发射数据给父组件的时候, import { EventEmitter } from '@angular/c

Angular 父子组件传值

Angular 父子组件传值 @Input  @Output  @ViewChild 新建一个头部组件 newsheader 在主组件引用 news 组件,在news组件添加 newsheader 组件. 设置newsheader组件样式 设置newsheader组件的内容,添加一个class属性 <h2 class="header">这是一个头部组件</h2> 如果需要全局设置,则在 style.css 中设置. 如果单独设置自己的,则在自己组件的css中设置

angular中不同controller传值问题 以及应用实例

参考 http://www.cnblogs.com/hardi/p/5232776.html http://www.codesec.net/view/168790.html 1 var myApp = angular.module("myApp", []); 2 myApp.factory('Data', function() { 3 return { 4 name: "Ting" 5 } 6 }); 7 8 myApp.controller('FirstCtrl'

vue 中父子组件传值:props和$emit

1 父组件向子组件传值:通过props数组: //父组件 App.vue <template> <div id="app"> <hello mes-father="爸爸无可奉告"></hello> </div> </template> //子组件Hello.vue <template> <div class="hello"> <p>{{me

angular控制器之间的传值

每个controller都会有自己的scope,所有的scope都是属于 $rootScope的子或者子的子... 那么问题就好解决了,通过 $rootScope.$broadcast 广播的事件每个controller都能收到事件 另外,我的经验是,尽量不要用event传数据.应该建立一个service来保存数据,并且设置相应getter/setter,具体如下: 每个controller依赖service, call service.setter(...) 统一的service.setter

Angular $scope和$rootScope事件机制之$emit、$broadcast和$on

Angular按照发布/订阅模式设计了其事件系统,使用时需要"发布"事件,并在适当的位置"订阅"或"退订"事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$scope和$rootScope的$emit.$broadcast和$on方法.本文介绍Angular的事件机制,包括$scope和$rootScope处理事件上的异同,$broadcast.$emit和$on的使用方式及他们区别等内容. $scope

Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解

Ionic3.x 页面 pop反向传值,主要有两种方式: 1 .利用ES6提供 Promise 对象 2 利用Ionic3.x提供Event对象,观察者模式(publish/subscribe) 1)利用ES6提供 Promise 对象 这边假设有两个页面A页面, B页面, 情景如下,A跳转B页面,在B页面返回A页面需要给A页面选回的值. A页面代码 <button (tap)="goToBPage()">跳转到B页面</button> ts 内容: impor