博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用postal.js在AngularJS中实现订阅发布消息
阅读量:6245 次
发布时间:2019-06-22

本文共 3000 字,大约阅读时间需要 10 分钟。

用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个变量。

 

 

二、用法

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

1 angular.module('myApp')   2     .config(function ($provide) { 3         $provide.decorator('$rootScope', ['$delegate', function ($delegate) { 5             Object.defineProperty($delegate.constructor.prototype, '$bus', { 7                 value: postal, 8                 enumerable: false 9             });10 11             return $delegate;12         }]);13     });

 

 为减轻内存泄漏问题,需要监听$destroy事件,调用unsubscribe方法。上面的代码变为:

1 angular.module('introToAngularApp')   2 .config(function ($provide) { 3     $provide.decorator('$rootScope', ['$delegate', function ($delegate) { 4         Object.defineProperty($delegate.constructor.prototype, '$bus', { 5             get: function() { 6                 var self = this; 7  8                 return { 9                     subscribe: function() {10                         var sub = postal.subscribe.apply(postal, arguments);11                         // 监听$destroy事件12                         self.$on('$destroy', function() {13                             sub.unsubscribe(); // 调用unsubscribe方法14                         });15                     },16                     channel: postal.channel,17                     publish: postal.publish18                 };19             },20             enumerable: false21         });22 23         return $delegate;24     }]);25 });

 

 

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

1 angular.module('myApp')   2     .controller('CartCtrl', ['$scope', function ($scope) { 3         $scope.$bus.subscribe({    // 订阅 4             channel: 'orders', 5             topic: 'order.new', 6             callback: function(data, envelope) { 7                 console.log('it worked', data, evenlope); 8             } 9         });10     }11 ])12     .controller('OrderCtrl', ['$scope', function ($scope) {13         $scope.order = function() {14             $scope.$bus.publish({    // 发布15               channel: 'orders',16               topic: 'order.new',17               data: { /* order info */ }18           });19         };20     }21 ]);

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

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

 

 

三、总结

通过使用$bus装饰器,你可以让控制器之间的交流变得非常轻松。当然除了postal.js之外,还有很多其他的event bus库可以选择。

 

 

 

参考资料1:【】

参考资料2:【】

转载于:https://www.cnblogs.com/softwarefang/p/6398248.html

你可能感兴趣的文章
一份关于jvm内存调优及原理的学习笔记
查看>>
怎么查看80端口占用情况- 如何查看端口占用情况?
查看>>
搭建测试框架
查看>>
position:absolute在IE8浏览器下无法显示正确位置
查看>>
过滤器与拦截器区别
查看>>
C# 使用 Windows API 发送文件到打印机
查看>>
NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
查看>>
80端口被NT kernel & System 占用pid 4
查看>>
mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
查看>>
完整性约束
查看>>
Django之restframework
查看>>
P3924 康娜的线段树
查看>>
Vue的安装和语法
查看>>
验证表单必须为数字并且只保留小数点后2位
查看>>
2-sat基础题 uvalive 3211
查看>>
Elasticsearch5.2.0部署过程的坑
查看>>
go build 不同系统下的可执行文件
查看>>
浏览器版本信息判断整理
查看>>
【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符...
查看>>
windows 下解决 Time_Wait 和 CLOSE_WAIT 方法
查看>>