AngularJS的简单订阅发布模式例子

Posted 暖暖的心窝子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

 














以上是关于AngularJS的简单订阅发布模式例子的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

redis 消息队列发布订阅模式spring boot实现

实现一个简单的订阅与发布模式的代码块,和redux

EventBus发布-订阅模式 ( 使用代码实现发布-订阅模式 )

4 交换机-fanout(订阅发布模式)

AngularJs 路由