用postal.js在AngularJS中实现订阅发布消息

用postal.js在AngularJS中实现event bus

用postal.js在AngularJS中实现event bus

理想状态下,在一个AngularJS应用中,控制器都应该是相互独立的代码单元,它们之间不应该有任何的相互引用。但是有些时候,你还是需要让控制器在你的应用中相互交流。例如你现在有一个叫做Orders的控制器,它需要告诉一个叫做Cart的控制器其中需要添加一个新项目。

实现这种类型的交流方式的最好的方法之一就是使用event bus。

postal.js正是一个在JS中实现了event bus的库。

Postal.js是什么?

  1. Postal.js是一个使用Javascript编写的,位于内存中的message bus,它收到了AMQP的一些启发。Postal.js在浏览器中运行,同时也可以使用Node.js在服务器端运行。它采用了JS程序员很熟悉的“事件类型”编程范式,同时通过提供“broker”以及更加精巧实现的subscriber来扩展了事件类型。

你可以使用postal在特定的频道中发布消息。通过这种方式,你可以将你的消息分割为app,cart,ui等不同类型。它同时也使用了envelope设计模式来方式你的订阅回调中有n个变量。

在使用postal.js时,你可以轻松的装饰$scope,并为它添加一个叫做$bus的方法来允许你和其他的控制器进行交流。

angular.module(‘myApp‘)
    .config(function ($provide) {
        $provide.decorator(‘$rootScope‘, [
            ‘$delegate‘, function ($delegate) {
            Object.defineProperty($delegate.constructor.prototype,
            ‘$bus‘, {
                value: postal,
                enumerable: false
            });

            return $delegate;
        }]);
    });

现在,你的控制器已经拥有了postal.js,你可以通过下面的代码来使用它:

angular.module(‘myApp‘)
    .controller(‘CartCtrl‘, [‘$scope‘, function ($scope) {
        $scope.$bus.subscribe({
            channel: ‘orders‘,
            topic: ‘order.new‘,
            callback: function(data, envelope) {
                console.log(‘it worked‘, data, evenlope);
            }
        });
    }
])
    .controller(‘OrderCtrl‘, [‘$scope‘, function ($scope) {
        $scope.order = function() {
            $scope.$bus.publish({
              channel: ‘orders‘,
              topic: ‘order.new‘,
              data: { /* order info */ }
          });
        };
    }
]);

在CartCtrl中,$scope.$bus.subscribe方法被调用。这个订阅被设置来监听orders频道上主题为order.new的所有消息。当一个消息的主题能够匹配上的时候,callback函数将会被调用。

在OrderCtrl中,$scope.$bus.publish方法在$scope.order方法被调用时被调用。它将会在正确的频道上发布一条消息,并使用正确的主题来触发订阅。发布出去的data将会被订阅中的callback收到,注意callback中还包含一个envelope,它是接收到的数据的一个包装。

总结

通过使用$bus装饰器你可以让控制器之间的交流变得非常轻松。当然除了postal.js之外,还有很多其他的event bus库可以选择。但是如果你喜欢这个库的话,别忘了去Github上给作者Jim Cowart一些感谢!

本文译自An angular.js event bus with postal.js,原文地址http://jonathancreamer.com/an-angular-event-bus-with-postal-js/

转载自: http://www.html-js.com/article/Using-Angular-to-develop-web-application-with-postaljs-is-implemented-in-AngularJS-event-bus

时间: 2024-11-12 01:38:03

用postal.js在AngularJS中实现订阅发布消息的相关文章

JS调用AngularJS中的方法

案例: 在IONIC中使用百度地图的JS版SDK,在该JS相关界面中需要触发点击事件来实现在Ionic的JS中定义的函数,参考方法如下: onclick="var $scope = angular.element(event.target).scope();$scope.hello()" 其中var $scope = angular.element(event.target).scope()代码就是当前js被触发时候的那个scope

关于JS中数组splice,concat的用法和AngularJs中filter的补充知识

一 JS数组相关操作 1. splice函数,可做插入,删除,替换操作 1 <script> 2 "use strict" 3 var arr = ['z3']; 4 arr.splice(1,0,'l4'); 5 alert(arr); //z3,l4 6 arr.splice(1,1,'w5'); 7 alert(arr); //z3,w5 8 arr.splice(1,1); 9 alert(arr); //z3 10 arr.splice(10,1,'l4','w5

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

控制器之间的交互方式广播 broadcast, 发射 emit 事件 类似于 js中的事件 , 可以自己定义事件 向上传递直到 document 在AngularJs中 向上传递直到 rootScope 观察者模式, 订阅发布模式 类似于js中的事件机制 订阅者.on('xx发布博客', function([内容]){ 通知我, 接收到博客的[内容] }) 发布者.emit('xxx发布博客', {内容}) 优点: 业务和实际触发者分离, 代码维护性相对好 缺点: 代码复杂性更高 Angular

AngularJs中的directives(指令)

一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 调用自定义指令的4种方式:元素.属性.样式类.注释. 常用的是前两种,实例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title>

黄聪:AngularJS中的$resource使用与Restful资源交互(转)

原文:http://blog.csdn.net/he90227/article/details/50525836 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了.      REST是Representational State Transfer(表征状态转移)的缩写,是服务器用来智能化地提供数据服务的一种方式 1)我们首先需要引入ng-Re

Angularjs中的事件广播-浅谈$broadcast,$emit,$on

Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传播至子级作用域,包括自己.格式如下:$broadcast(eventName,args) $emit的作用是将事件从子级作用域传播至父级作用域,包括自己,直至根作用域.格式如下:$emit(eventName,args) $on用于在作用域中监控从子级或父级作用域中传播的事件以及相应的数据.格式如下:$on(event,dat

AngularJs中,如何在父元素中调用子元素为自定义Directive中定义的函数?

最近一段时间准备使用AngularJs中的自定义Directive重构一下代码. 在这里说明一下,把自定义控件封装成Directive并不一定是要复用,而是要让代码结构更加清晰.就好像你将一个长方法拆分成多个独立的小方法,也未必要复用它们一样.职责独立等一票好处,会让后期维护更加轻松. 在重构的过程中,我遇到了这样一个问题,先上图: 图一: 这就是我要重构的界面,由于之前时间紧,将这三个Filter和两个button都写在了一个页面中.当时我已经预感到,如果将这里面的状态都写到一个scope上,

通过几段代码,理清angularJS中的$injector、$rootScope和$scope的概念和关联关系

$injector.$rootScope和$scope是angularJS框架中比较重要的东西,理清它们之间的关系,对我们后续学习和理解angularJS框架都非常有用. 1.$injector其实是一个IOC容器,包含了很多服务(类似于spring框架中的bean),其它代码能够通过       $injector.get("serviceName")的方式,从injector中获取所需要的服务.详情参考这篇文章 2.scope是angularJS中的作用域(其实就是存储数据的地方)

《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想

总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and AngularJS Web Development>,总的来说是一本讲述如何用Javascript进行B/S架构全栈开发的书. 该书主要讲解4种技术(框架),分为6个部分29个章节.4种技术即Node.js.MongoDB.Express.AngularJS,业内称为MEAN:6个部分我个人理解为: 基础(引言).