很简单的一个应用 通过按钮来限制输入范围
,这样的话再配合服务器端检测就能在一定范围内限制输入数据,这次从重构的角度讲解如何一步步将代码变得更加优美:)
1.原始代码,业务逻辑与ui混合
function Increaser(domInput,domAction){
this.input=domInput;
this.domAction=domAction;
this.domAction.on("click",this.increasing,this);
}
Increaser.prototype.increasing=function(e){
if(this.input.get("value")=="3"){
this.input.set("value",0);
}else{
this.input.set("value",parseInt(this.input.get("value"))+1);
}
};
new Increaser(Y.one("#v"),Y.one("#r"));
2.利用Observer模式重构
改进类,区分业务domain与ui,duplicate observed data,
将数据复制到一个领域对象中,建立一个observer模式,用以同步领域对象和gui对象内的重复数据
function GuiIncreaser(domInput, domAction) {
this.input = domInput;
this.domAction = domAction;
this.domainIncreaser = new DomainIncreaser(this.input.get("value"));
this.domainIncreaser.addObserver(this);
this.domAction.on("click", this.increasing, this);
}
GuiIncreaser.prototype = {
constructor: GuiIncreaser,
increasing: function (e) {
this.domainIncreaser.increase();
},
//observer
update: function (v) {
this.input.set("value", v);
}
}
function DomainIncreaser(v) {
this.v = v;
this.observers = [];
}
DomainIncreaser.prototype = {
constructor: DomainIncreaser,
addObserver: function (o) {
if (Y.Array.indexOf(this.observers, o) == -1) {
this.observers.push(o);
}
},
checkChange: function () {
if (this.v == "4") this.v = 0;
},
//observable
notify: function () {
for (var i = this.observers.length - 1; i >= 0; i--) {
this.observers[i].update(this.v);
}
},
increase: function () {
this.v = parseInt(this.v) + 1;
this.checkChange();
this.notify();
}
}
new GuiIncreaser(Y.one("#v"),Y.one("#r"));
3.利用 attribute 简化
利用 yui3 attribute 简化2,将domain和gui重新结合,利用yui3 attribute来实现属性与ui的分离与同步
function AttributeIncreaser(domInput, domAction) {
this.input = domInput;
this.domAction = domAction;
var attrs = {
"v": {
value: this.input.get("value"),
//domain业务逻辑
setter: function (v) {
if (v == "4") return 0;
}
}
};
this.addAttrs(attrs);
//domain业务逻辑
this.domAction.on("click", this.increase, this);
//属性与gui同步
this.after("vChange", this.afterVChange, this);
}
AttributeIncreaser.prototype = {
constructor: AttributeIncreaser,
increase: function () {
this.set("v", parseInt(this.get("v")) + 1);
},
afterVChange: function (e) {
this.input.set("value", e.newVal);
}
};
Y.augment(AttributeIncreaser, Y.Attribute);
new AttributeIncreaser(Y.one("#v"), Y.one("#r"));
2,3 的另一个好处是尽可能少得 touch dom,提高了运行效率,这对于复杂应用至关重要。
分享到:
相关推荐
python3 server.py 127.0.0.1 8888 ...AttributeError: module ‘os’ has no attribute ‘exit’ 部分代码入下: from socket import * import sys,os #实现登录 def do_login(s,user,name,addr): for i in user: i
AttributeError: module 'tensorflow.compat.v1' has no attribute 'contrib'的问题您具体怎么解决问题具体解决的seq_loss.py文件
问题描述及解决: 原创文章 1获赞 1访问量 17 关注 私信 展开阅读全文 作者:Branson233
调试递归神经网络(RNN)的时候出现如下错误: AttributeError: module 'tensorflow.contrib.rnn' has no attribute 'core_rnn_cell' 顺便问一句,资源分怎么设置免费啊
如图示,会出现如AttributeError: ‘DataParallel’ object has no attribute ‘xxx’的错误。 原因:在使用net = torch.nn.DataParallel(net)之后,原来的net会被封装为新的net的module属性里。 解决方案:所有在...
在使用PaddlePaddle进行深度学习开发时,可能会遇到一个常见的错误:`AttributeError: module 'paddle.fluid' has no attribute 'EndStepEvent'`。这个问题通常发生在尝试使用PaddlePaddle的旧版本API或者在不正确的...
在Python编程语言中,`AttributeError` 是一种常见的异常类型,它表示尝试访问或操作一个对象的属性时,发现该属性并不存在。在本篇内容中,我们将深入探讨在Python3环境下遇到`AttributeError: 'dict' object has ...
成功解决AttributeError: 'str' object has no attribute 'to'
今天安装pymysql时发生了错误AttributeError: module ‘pip’ has no attribute ‘main’ 解决方法如下: 1.找到PyCharm 2017.1\helpers\packaging_tool.py 2.打开packaging_tool.py,注意,最好用pycharm打开,因为...
在Python编程中,特别是在进行网页抓取(网络爬虫)时,可能会遇到`AttributeError: 'NoneType' object has no attribute 'children'`这样的错误。这个错误表明在尝试访问一个对象的`children`属性时,该对象实际上...
然而,随着Scipy的更新,这些函数已被弃用,主要原因是它们的功能与其他更专业、更强大的图像处理库(如PIL、OpenCV或imageio)重叠,而且在某些方面可能不如这些库高效或灵活。弃用这些函数是为了鼓励用户使用更...
通过遵循这些规则,你可以有效地利用PyQt的信号和槽机制,构建出健壮的图形用户界面应用程序。在学习PyQt时,参考相关的教程和博客,如《Python基础教程目录》、《使用PyQt开发图形界面Python应用》和《PyQt入门学习...
【多线程爬虫出现报错AttributeError: ‘NoneType’ object has no attribute ‘xpath’】 一、前言 在学习Python网络爬虫的过程中,多线程爬虫是一种提高效率的有效方式,它允许同时处理多个任务,从而缩短整体...
报错信息: Traceback (most recent call last): File “D:/flaskProject/test.py”, line 35, in test pool.apply(self.out, args=(i,)) File “Python37-32\lib\multiprocessing\pool.py”, line 261, in apply ...
import pymysql #创建连接 con = pymysql.connect(host='localhost',user='root',password='123456',port=3306,database='zhy') #创建游标对象 cur = con.curson() #编写查询的sql语句 sql = 'select * from t_...
Python的字符集处理实在蛋疼,目前使用UTF-8居多,然后默认使用的字符集是ascii,所以我们需要改成utf-8 查看目前系统字符集 复制代码 代码如下: import sys print sys.getdefaultencoding() 执行: ...
【问题描述】 今天在搭建django-rest-swagger的时候出现了如下错误: Traceback (most recent call last): File "D:\anaconda\lib\site-packages\django\core\handlers\exception.py", line 34, in inner ...