用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
  • TA的每日心情
    郁闷
    2017-6-29 17:34
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    76

    主题

    104

    帖子

    10万

    金钱

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    0

    优秀版主

    2017-1-16 17:18:06 cyk 管理员 楼主 01726
    微信小程序中各个界面之间的传值和通知比较蛋疼。所以模仿了iOS中的通知中心,在微信小程序中写了一套类似的通知中心。
    通知中心可以做到:1对多发消息,传递object。使用十分简洁。
    使用时,在需要接收消息的界面注册一个通知名。然后在需要发消息的界面post这个通知名就可以了。可以在多个界面注册同一个通知名。这样就可以1对多发消息。
    使用方法:
    1:在app.js中引用notification.js
    [AppleScript] 纯文本查看 复制代码
    var notificationCenter = require('/utils/notification.js'); //这里请改为你的绝对路径
    [color=#666666]
    2:在app.js中添加:
    [AppleScript] 纯文本查看 复制代码
    App({
       onLaunch: function (){
              this.notificationCenter = notificationCenter.center();
        },
        notificationCenter:null,
    })
    3: 接收通知的page.js中注册
    PageA.js:
    [AppleScript] 纯文本查看 复制代码
    var app = getApp();
    Page({
      onLoad:function(options){
      app.notificationCenter.register("一个通知名称",this,"didReceviceAnyNotification");
      },
      didReceviceAnyNotification:function(name,content){
        console.log("接收到了通知:",name, content);
      },
    })
    4: 发出通知的page.js中
    PageB.js 任意函数
    [AppleScript] 纯文本查看 复制代码
    var app = getApp();
    Page({
      anyFunction:function(){
        app.notificationCenter.post("通知名称",{
            //任意通知object
        })   ;
      },
    })
    实现:
    文件下载;notification.js
    [AppleScript] 纯文本查看 复制代码
    var notificationCenter = {
     
    notificationCenter:{},
     
    // 向通知中心注册一个监听者。
    // name: 监听的通知名称
    // observer: 监听者
    // action: 监听者收通知时调用的方法名,
    // func: 监听者收到通知时调用的函数,
    // action func 2选1
    register:function(name,observer,action,func){
        if (!name || !observer) return;
        if (!action && !func) return;
     
        console.log("注册通知:",name,observer);
     
        var center = this.notificationCenter;
        var objects = center[name];
        if (!objects){
            objects = [];
        }
        this.remove(name,observer);
        objects.push({
            observer:observer,
            action:action,
            func:func
        });
        center[name] = objects;
    },
    // 从通知中心移除一个监听者
    remove:function(name,observer){
        if (!name || !observer) return;
     
        var center = this.notificationCenter;
        var objects = center[name];
        if (!objects){
            return;
        }
     
        var idx;
        var object;
        for(idx = 0;idx<objects.length;idx++){
            var obj = objects[idx];
            if (obj.observer == observer){
            object = obj;
            break;
            }
        }
        if (object){
            objects.splice(idx,1);
        }
        center[name] = objects;
    },
    // 通过通知中心发出通知
    // name: 通知名称
    // notification: 通知内容
    post:function(name,notification){
        if (!name) return;
     
        console.log("准备发出通知:",name,notification);
     
        var center = this.notificationCenter;
        var objects = center[name];
        if (!objects){
            objects = [];
        }
        objects.forEach(function(object){
            var observer = object.observer;
            var action = object.action;
            var func = object.func;
     
            if (observer && action){
                func = observer[action];
            }
            func(notification);
        });
     
        console.log("完成向 ",objects.length," 个监听者发出通知:",name);
    }
    }
     
    function center(){
        return notificationCenter;
    }
     
    module.exports.center = center;
    附件下载:
    游客,如果您要查看本帖隐藏内容请回复

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册
    咫尺论坛|小程序开发社区
    X

    扫码添加专属客服即可随时咨询

    还可领取小程序推广攻略