zoukankan      html  css  js  c++  java
  • AngularJS的简单订阅发布模式例子

    控制器之间的交互方式
    广播 broadcast, 发射 emit 事件
    类似于 js中的事件 , 可以自己定义事件
    向上传递直到 document

    在AngularJs中
    向上传递直到 rootScope


    观察者模式, 订阅发布模式 类似于js中的事件机制
    订阅者.on('xx发布博客', function([内容]){ 通知我, 接收到博客的[内容] })
    发布者.emit('xxx发布博客', {内容})
    优点:
    业务和实际触发者分离, 代码维护性相对好

    缺点:
    代码复杂性更高

    AngularJs
    $emit, $broadcast, $on

    $emit: 向上发布事件, 类似于冒泡原理

    $broadcast: 向下发布事件, 类似于捕获原理
    scope.$broadcast/$emit('发布的主题', 携带的数据/内容, ...);

    $on: 监听某个事件(主题)
    scope.$on('监听的主题', 主题触发时的行为function(主题的事件对象event, 传递的参数1, 传递的参数2, ..){})

    该例子就是 :点击button  添加一个 box,  点击单个box 又 删除到该box;

          点击button时候 用$broadcast函数广播一个broadcast事件,在子控制器里 利用$on函数接收广播到的事件,进行添加;

          点击box时候  用$emit向上发射一个事件    在父控制器里用$on接收该事件

    <!DOCTYPE html>
    <html lang = "en">
    <head>
        <meta charset = "UTF-8">
        <title>Title</title>
        <style>
            .box {
                width: 80px;
                height: 80px;
                border-radius: 5px;
                border: 1px solid #cccccc;
    
                margin: -1px 0 0 -1px;
                display: inline-block;
            }
        </style>
        <script src = "angular.js"></script>
    </head>
    <body ng-app = "app" ng-controller = "ctrl">
    
    <button ng-click = "broadcast()">添加</button>
    
    <div class = "out" ng-controller="ctrl1" ng-click="remove()">
    
        <div data-index="{{$index}}" class = "box" ng-repeat="i in arr track by $index"  ng-style="{background:i}" ng-click="emit($index)">
    
        </div>
    
    </div>
    <script>
        var app = angular.module('app', []);
        var arr = [color()];
        function color() {
            var col = 'rgb(';
            var radomCol1 = Math.floor(Math.random() * 256);
            var radomCol2 = Math.floor(Math.random() * 256);
            var radomCol3 = Math.floor(Math.random() * 256);
            col += radomCol1 + ',' + radomCol2 + ',' + radomCol3 + ')';
            return col;
        }
    
        app.controller('ctrl', ['$scope', function (s) {
    
            s.arr=arr;
            s.broadcast =function () {
                s.$broadcast('addBox',{color:color()});
            } ;
            s.$on('removeBox',function (event,data) {
                var index = data.index;
    
                arr.splice(index,1);
            });
    
        }]);
        app.controller('ctrl1',['$scope',function (s) {
    
    
            s.$on('addBox',function (event,data) {
    
    //            console.log(data);
                arr.push(data.color);
            });
            s.emit=function (i) {
                s.$emit('removeBox',{index:i});
            };
    
        }]);
    
    </script>
    </body>
    </html>
  • 相关阅读:
    DNS正向反向解析
    varnish-4.0.5的反向代理 缓存测试 负载均衡实验
    DS8700 硬盘更换略
    ftp虚拟用户
    maven mvn 命令行 编译打包
    linux下的springboot项目启动文件
    linux系统安装gcc
    linux系统下安装两个或多个tomcat
    linux系统的磁盘挂载
    常用linux命令
  • 原文地址:https://www.cnblogs.com/shuaishuaidejun/p/6701045.html
Copyright © 2011-2022 走看看