先来图:
这张图是查看单张照片的界面。
现在的问题是,如何设计和实现这张页面。
大家注意到,随着图片的改变,页面是不刷新的,也就是说你查看另外一张图片时,页面中的很多信息需要同步修改,如下图:
还有一块很重要的信息,那就是图片的评论,也需要随之改变。
我们的要求是,实现这个功能的代码需要清楚,模块化,容易维护,扩展容易。
现在我们的难题似乎是图片改变的同时,其他的信息用一种什么方式随之改变,我们这里定义了一个接口:
/**
* 改变照片的事件监听器
*/
var PhotoChangeListener = Class.create({
initialize:function(){},
/**
* 当改变照片时,该方法被调用
* @param newPhotoId 改变的新的照片id
* @param isNext boolean 是否是查看下一张图片
*/
handlePhotoChange:function(newPhotoId,isNext){
}
});
用js来定义接口实在是小题大作,不过,这样定义感觉上会更清楚明白一些。
这个监听器处理的代码是在handlePhotoChange里完成。
为此,我们还设计了一个所有照片的持有类,美其名曰:“封装”
/**
* 照片集合的持有类
* 当调用setCurrentPhoto时,会依次调用photoChangeListeners中的照片改变的事件监听器里的handlePhotoChange方法
*/
var PhotosHolder = Class.create({
/**
* @param photos 照片对象的列表
*/
initialize:function(photos){
},
getPhotoNumber:function(){
},
/**
* 得到某个photoId的photo对象
* 如果不存在该photoId的photo,则返回null
*/
getPhoto:function(photoId){
},
indexOfPhoto:function(photoId){
},
/**
* 增加一个照片改变的监听器
*/
addPhotoChangeListener:function(photoChangeListener){
},
/**
* 设置某照片为当前的照片
*/
setCurrentPhoto:function(photoId,isNext){
},
/**
* 得到下一张照片,如果没有下一张照片,返回null
*/
nextPhoto:function(){
},
/**
* 得到上一张照片,如果没有上一张照片,返回null
*/
previousPhoto:function(){
},
/**
* 得到当前页面上显示的照片
*/
getCurrentPhoto:function(){
},
/**
* 得到第一张图片
*/
getFirstPhoto:function(){
},
/**
* 得到最后一张图片
*/
getLastPhoto:function(){
},
/**
* 增加一个照片标记信息
* @param photoMentionInfo 标记信息对象
*/
addPhotoMention:function(photoMentionInfo){
},
/**
* 增加某张照片的一批标记信息
*/
addPhotoMentions:function(photoId,mentions){
},
/**
* 删除一个照片标记信息
*/
removePhotoMention:function(mentionInfoId){
},
/**
* 得到某照片的标记信息,如果不存在,则返回null
*/
getPhotoMentions:function(photoId){
}
});
这里给出了接口定义,具体的实现也不是很困难,我们重点注意这两个方
法:addPhotoChangeListener,setCurrentPhoto。方法addPhotoChangeListener用于将图片改变
的监听器注册到图片的持有者中,setCurrentPhoto方法用于客户端设置显示某一张图片,在setCurrentPhoto方法中,如果设置的
图片不是当前显示的图片,就会调用注册到该类的所有图片监听器的handlePhotoChange,剩下的工作就交给各个监听器处理了。
这里的设计思想是,解耦。我们可以将图片改变的动作和处理该图片改变的处理分开,往往处理逻辑需要很多,我们只需要增加一个PhotoChangeListener,然后注册到photosHolder就行了。
这里作为demo,给出照片信息显示的实现:
/**
* 照片信息的显示类
*/
var PhotoInfoObserver = Class.create(PhotoChangeListener,{
initialize:function($super,photosHolder){
$super();
this.createTime = $('createTime'); //上传时间
this.hits = $('hits'); //浏览次数
this.comments = $('comments'); //评论次数
if(!this.createTime||!this.hits||!this.comments) return;
this.photosHolder = photosHolder;
this.photosHolder.addPhotoChangeListener(this);
},
handlePhotoChange:function(newPhotoId){
this.createTime.update('上传于:'+this.photosHolder.getCurrentPhoto().createTimeStr);
this.hits.update('浏览('+this.photosHolder.getCurrentPhoto().hits+')');
this.comments.update('评论('+this.photosHolder.getCurrentPhoto().comments+')');
}
});
最终,我们将会实例化所有的处理类:
this.photosHolder = new PhotosHolder(photos);
this.croperHandler = new CroperHandler(this.photosHolder); //照片圈人
this.carouselHandler = new CarouselHandler(this.photosHolder); //照片导航
this.photoDeleter = new PhotoDeleter(this.photosHolder); //删除照片的工具类
this.pageSetter = new PageSetter(this.photosHolder); //设置为封面的工具类
this.originalPhotoView = new OriginalPhotoView(this.photosHolder); //原图查看的工具类
this.descEditObserver = new DescEditObserver(this.loginUserId,this.photosHolder);//描述信息修改
this.photoInfoObserver = new PhotoInfoObserver(this.photosHolder);//照片浏览评论等信息显示
this.exifInfoObserver = new ExifInfoObserver(this.photosHolder);//exif信息显示
this.photoComment = new PhotoComment(this.photosHolder,this.loginUserId,this.loginUserHead);//照片评论
this.photoNumObserver = new CurrentPhotoNumObserver(this.photosHolder);//当前照片序号显示
this.hitsIncreaseObserver = new HitsIncreaseObserver(this.photosHolder);//浏览数递增的观察器
this.statObserver = new StatObserver(this.photosHolder);//页面浏览统计的观察器
this.photosHolder.setCurrentPhoto(this.photoId);
如果哪一部分需要改变,只需要定位到该部分做修改;如果我们需要增加新的逻辑,只要增加一个类就行。
分享到:
相关推荐
前端毕业设计:基于Vue的校园论坛 前端毕业设计:基于Vue的校园论坛 前端毕业设计:基于Vue的校园论坛 前端毕业设计:基于Vue的校园论坛 前端毕业设计:基于Vue的校园论坛 前端毕业设计:基于Vue的校园论坛 ...
三维人脸建模 单张照片 一般模型 表情变化
单张影像空间后方交会程序设计
Web前端设计与开发和前端框架搭建与进阶开发 【htm、javascript、css、jQuery学习】初学者学习前端的必备课程设计安排 内容包括: 1.html学习路径课程和整理的学习地址链接 2.css学习路径课程和整理的学习地址链接 3...
关于产品的入库,出库 等单据的前端设计,由于文件太大,没附带数据库的内容,希望能给初学者帮助。
适合小型网站的课程设计
单张图片上传,无需在xml里进行配置直接在ACTION中就可以引用
单张全套扑克牌图片,适合游戏开发,素材等
PPT单张模板
此套工单管理系统,使用bootstrap+layer+jquery写成 页面有,登陆页 工单首页,首页含有工单的仪表盘,通告,动态等 工单管理,含工单增删改查等页面,重要的是工单的筛选,和搜索 工单处理页面,主要有工单的新建,...
本文介绍了一种应用于IEEE 802.11b/g无线局域网标准的2.4 GHz ISM单片CMOS接收机射频前端设计。
用vue2.0+echart做的工单关闭率看板,布局使用的是flex布局,访问用的是axios,通过前端调用后台接口的数据进行联动展示,主要实现的功能如下: 根据筛选的日期axios将接口的数据动态绑定到柱状图,treemap图,如果不...
光剑效果(单张光效),可以作为RPG的动画的素材。
为ios开发爱好者,解决难题。单张图片上传与多张图片上传。
在前端开发领域中,单元测试一直是一个被忽视的领域,早期大量的偏U类代码使得前端开发并没有养成书写单元测试的习惯,但随着前端项目的日益复杂,包括 Node. js的大量应用开发,为应用程序书写单元测试才是保证代码质量...
这只是一个演示版本,图片要选择三通道图片,选择图片时没有做过滤检测,如果图片格式不对会出错,需要代码请联系作者。要求输入图片为正面,无遮挡,光照均匀。如果使用附带图片还是运行出错则与本软件无关。...
四元数算法用于单张相片空间后方交会,精度较传统的欧拉角算法有大的提高。
行业文档-设计装置-单张壁纸印刷机.zip
行业文档-设计装置-单张报纸阅览器.zip
webuploader上传单张图片