发布订阅

订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。

全局订阅

  1. // dom初始化完毕就可以执行
  2. bui.on("pagereadybefore",function(){
  3. })
  4. // 页面准备完毕后触发
  5. bui.on("pageready",function(){
  6. // 不管是web,还是native 最终都会触发 pageready 事件.
  7. })

路由订阅

全局事件 ?> 具体查看 bui.router API

  1. // 监听后退事件,只要触发了后退, 不管通过按钮触发,还是通过物理后退
  2. router.on("back",function(e){
  3. // 执行
  4. // e.target 跳转后的页面
  5. // e.prevTarget 跳转前的页面
  6. })
  7. // 每次跳转完成以后执行
  8. router.on("complete", function(e) {
  9. // 执行
  10. // e.target 跳转后的页面
  11. // e.prevTarget 跳转前的页面
  12. })

控件订阅

例子1: 用得最多的Tab选项卡.

  1. // 初始化一个控件
  2. var tab = bui.tab({
  3. id: "#id"
  4. })
  5. // tab有多种切换选项卡的方式, 所以只能在这里监听, 比方点击可以切换, 滑动可以切换, 直接调用to也可以触发.
  6. tab.on("to",function(){
  7. var index = this.index();
  8. console.log(index);
  9. })
  10. // 执行就会触发一次
  11. tab.to(0)

例子2:

  1. // 初始化一个控件
  2. var dialog = bui.dialog({
  3. id: "#id"
  4. })
  5. // 监听打开事件, 对话框默认是隐藏的, 隐藏的dom,在zepto.js 里面是拿不到宽高的,
  6. // 如果对话框里面有一些用到计算的地方, 应该监听该实例打开以后才做控件初始化或计算.
  7. dialog.on("open",function(){
  8. // 对话框打开后才执行
  9. })
  10. // 监听关闭事件
  11. dialog.on("close",function(){
  12. // 对话框关闭后执行
  13. })

组件发布订阅

单页面上的组件通讯, 可以通过全局的 loader.on loader.trigger 等方法.

初始化

页面组件加载了搜索组件跟列表组件

  1. <component name="page/search/index"></component>
  2. <component name="page/list/index"></component>

搜索组件: page/search/index.js

  1. loader.define(["page/list/index"], function(list,require,export,module){
  2. // 组件从上到下执行, on的监听必须在前面, 搜索组件监听了列表组件的点击事件,
  3. loader.on("clickid",function(e){
  4. // 传过来的参数
  5. console.log(e);
  6. })
  7. })

列表组件: page/list/index.js

  1. loader.define(function(require,export,module){
  2. $("#id").click(function(e){
  3. // 触发了click事件, 搜索组件那边会拿到对应的参数做相应处理.
  4. loader.trigger("clickid",e);
  5. })
  6. })

自定义全局订阅

自定义的命名应该避免跟默认已有的冲突, 必须在trigger触发前先进行注册

  1. // 在页面监听
  2. bui.on("page-list-refresh",function(e){
  3. console.log(e)
  4. // 传过去的参数
  5. })
  1. // 在页面监听
  2. bui.trigger("page-list-refresh","传过去的参数")

例子: 假如进入列表需要权限, 进入列表就通过 bui.page 插入了一个登录页, 登录页点击校验通过就要触发关闭, 我们知道可以通过 bui.history.getPageDialog(module.id) 来获取到对话框进行关闭操作, 这种是在登录页的处理. 还有一些业务类, 之间交互比较复杂, 登录页需要不断的require之前的模块进行操作, 我们可以尝试另外一种方式. 登录只做登录该做的事.

列表页: pages/list/index.js

  1. var uipage = bui.page({
  2. url:"pages/login/index.html"
  3. })
  4. // 如果登录成功,
  5. bui.on("loginsuccess",function(user){
  6. // 关闭掉对话框
  7. uipage.close();
  8. // 并且在这个模块可以方便的拿到当前模块相关信息处理.
  9. })

登录页: pages/login/index.js

  1. $("#login").click(function(){
  2. // 校验帐号密码
  3. var user = {
  4. name: "",
  5. password: ""
  6. };
  7. // 请求去校验帐号密码, 正确就返回true
  8. if( check(user) ){
  9. bui.ajax({
  10. url: "http://api/login",
  11. success: function(){
  12. // 告诉那些订阅过 loginsuccess 的操作, 可以执行了, 并把用户信息传了过去.
  13. bui.trigger("loginsuccess",user)
  14. }
  15. })
  16. }
  17. })