起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2658|回复: 3

[分享] 如何解决不同页面间的通讯问题

  [复制链接]

191

主题

688

帖子

3327

积分

论坛元老

Rank: 8Rank: 8

积分
3327
QQ
发表于 2016-7-12 14:10:38 | 显示全部楼层 |阅读模式
本帖最后由 ysk007 于 2016-9-4 11:40 编辑

shell框架下有个派发功能来解决不同页面的监听调用问题,学习难度有点大,另外培训视频中也讲过通过公共变量的方式来解决不同页面之间的通讯问题,但是通用性不强。
http://bbs.wex5.com/forum.php?mo ... 97074&extra=&page=2,此贴中讲了回调函数的使用,能够解决监听问题,本来想用这个原理改成双向监听,但是受到此贴中16楼qldsrx的启发,如果把model作为全局变量的话,不同页面的调用就会变得简单,易于理解,再参考postMessage的原理做个通讯接口,那么单页模式下的通讯问题就看起来更加简单、自然、优美了。
附件中可以看到引导页、主页、明细页之间互相调用的例子。
核心代码:
        var Model = function(){
                this.callParent();
                window.models = new Object();;//创建公共变量,引导页创建,其他页不需要
                window.models["/demo/models/index.w"] = this;//注册公共变量,每个页都可以这样写
        };

        Model.prototype.modelUnLoad = function(event){
                delete  window.models["/demo/models/index.w"]; //注销共同变量,每个页都可以这样写
        };

//调用明细页的方法               
        Model.prototype.button3Click = function(event){
                var detail = window.models["/demo/models/detail.w"];                               if(!detail){return ;} //加个判断比较安全些
                var msg = detail.onMessage("close");
                alert(msg);
        };
//调用主页的方法
        Model.prototype.button2Click = function(event){
                var main = window.models["/demo/models/main.w"];
                if(!main){return ;} //加个判断比较安全些
                var msg = main.onMessage("close");
                alert(msg);
        };
//监听接口,每个页都可以增加这个函数        
        Model.prototype.onMessage = function(faction,fdata){
                var msg = '';
                if(faction == 'close'){
                        msg = this.canClose();
                        return msg;
                }//后面可以无限扩展其他else if了
        };
//本页内的方法
        Model.prototype.canClose = function(){
                var msg = "please wait,I am from index";
                return msg;
        };




models.zip

40.03 KB, 下载次数: 140

评分

参与人数 1威望 +40 收起 理由
负暄 + 40 很给力!

查看全部评分

轻量化ERP--企业邦  网址:meiprocess.cn
qq:8269301
手机:13801998595

64

主题

471

帖子

1127

积分

金牌会员

Rank: 6Rank: 6

积分
1127
发表于 2016-7-12 20:38:45 | 显示全部楼层
严谨点的话,在得到某页面的model对象后,要判断是否为空,如果页面因为被关闭导致被置空值,再次访问肯定会异常。
至于性能是没有任何损失的,而且这里面的引用是单向的,从全局引用到model,model未曾反向引用到全局,释放会很简单。相比Data组件那复杂的引用链,还有shell类里面内部的路由存储,那才会有性能问题,即使js可以智能到自动回收这样的循环引用对象,判断过程也会很复杂。
回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
发表于 2016-7-12 22:30:09 | 显示全部楼层
收藏了,非常感谢!
回复 支持 反对

使用道具 举报

1017

主题

4393

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
11173
QQ
发表于 2016-7-20 15:23:16 | 显示全部楼层


        Model.prototype.modelUnLoad = function(event){
               delete  window.models["/demo/models/index.w"]; //删除model对象,每个页都可以这样写
        };
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-6-13 00:35 , Processed in 0.070076 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表