mozilla里面的事件处理完全采用了生产 者-消费者(广播-观察)模型,这使得一个事件发生时(一个命令被执行,或者一个控件的某种状态发生改变),响应可以有多个。
比如这个插件里pg2-go-command和pg2-search- command两个命令是否disabled,是由被观察 (observes)的pg2-pastable-broadcaster来决定的,而这个broadcaster的状态改变又是检查cmd_paste 这个内置命令的状态来改变的,这个检查的时机是在地址栏(urlbar)的右键菜单显示或者隐藏时(见content/pasteandgo2.js):
const CmdBroadcasterId = "pg2-pastable-broadcaster";* 偏好(preference)
this.pgUrlbar = document.getElementById("urlbar");
this.pgUrlbar.addEventListener("popupshowing", pgInstallGo, false);
this.pgUrlbar.addEventListener("popuphiding", this.enableCmds, false);
this.nativePasteCmd = document.getElementById("cmd_paste");
this.cmdBroadcaster = document.getElementById(CmdBroadcasterId);
var isPasteDisabled = pgPrefsObserver.nativePasteCmd.getAttribute('disabled');
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', isPasteDisabled);
enableCmds: function(event) {
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', 'false');
}
与简单的GUI toolkit不同的是,Mozilla/XUL平台对于偏好(preference)数据考虑比较周全,比如偏好如何存储,如何处理用户设置与系统默认值,扩展如何扩充偏好项目,偏好数据改变(比如直接修改)如何让界面得到相应改变等等。
在Paste and Go 2的代码content/options.xul中, 我们还可以看到另一方面支持: 将一个偏好选项绑定到一个界面控件上,界面初始化时,可自动从偏好数据设置控件的值; 界面控件的值改变时,偏好数据也就变了,不用自己再费很多劲自己写脚本读写数据(想想我们很多时候写程序非常不情愿写个”选项“对话框,这算其中一个主要 原因)。
怎么样,很省事吧?MFC里面的DDX跟这个有点类似,但只能变量与控件值绑定这一步,缺乏将数据持久化 (persistence)功能。
没有评论:
发表评论