发布一个事件给一个主题的所有订阅者。发布者被作为基础dojo( dojo.js的)的一部分,因此不需要额外的要求。
介绍
dojo.publish作为topic相关的三个函数之一,被用在应用程序中publish(broadcast?)任何类型的信息,被同一个通道的其他函
数接收。通道是任何形式的任何字符串。此外,像其他的Dojo事件函数,一个dojo.unsubscribe函数被用来断开订阅通道的。
示例
简单的主题
监听听一个名为“foobar ”的数据通道:
// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
connect.subscribe("foobar", function(message){
console.log("I got: ", message);
});
});
// Dojo < 1.7
dojo.subscribe("foobar", function(message){
console.log("I got: ", message);
});
将信息发布到该通道:
// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
connect.publish("foobar", [{item:"one", another:"item", anObject:{ deeper:"data" }}] );
});
// Dojo < 1.7
dojo.publish("foobar", [{item:"one", another:"item", anObject:{ deeper:"data" }}]);
在执行时, 登记的匿名函数在认购中被执行来传递对象。
删除订阅
订阅返回一个订阅的手柄,在之后被用于断开,很像dojo.connect和dojo.disconnect之间的关系。只需将句柄作为唯一的参数传
递给dojo.unsubscribe并且不再接收更新。
// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
var handle = connect.subscribe("/foo/bar", function(message){
// only runs once in this case:
connect.unsubscribe(handle);
});
});
// Dojo < 1.7
var handle = dojo.subscribe("/foo/bar", function(message){
// only runs once in this case:
dojo.unsubscribe(handle);
});
在上面的例子中,我们从订阅的函数内断开手柄,从而有效地创建一个“订阅一次”的格局。在 /foo/bar通道上第一时间publish
东西后,连接中断,该函数将沉寂。
另请参阅
许多其他组件使用本主题的机制进行通信。例如,Drag和Drop使用通道/dnd/move/start 和/dnd/move/end来publish关于左右
拖动操作的信息,以及开发商根据需要来订阅这些。
此外, Cometd客户端实现一系列publish/subscribe/unsubscribe来为他的沟通服务。该机制是相同的,尽管有comet 的认购可
以存在于不同的主机和域的其他客户端上。
几个的Dijit小部件使用publish 以提醒用户(和它们的操作其它内部部分)关于状态的变化。举例来说,一个新的选项卡添加到
TabContainer的任何时候,一个消息在channel被发送出去,基于Tabs的ID:
/// Dojo 1.7 (AMD)
require(["dojo/_base/connect"], function(connect){
var id = "myTabs";
connect.subscribe(id + "-addChild", function(child){
// child is the new pane being added to the tabs with id="myTabs"
});
});
// Dojo < 1.7
var id = "myTabs";
dojo.subscribe(id + "-addChild", function(child){
// child is the new pane being added to the tabs with id="myTabs"
});
阅读(1183) | 评论(0) | 转发(0) |