我有一个鼠标活动课程.我正在使用dojo b / c我喜欢它的OO方法
dojo.declare("MouSEObject",null,{
constructor: function(){},onclick : function(){...},_onClick : function(){...}
});
_onClick()侦听窗口生成的鼠标按下/释放事件,并确定是否发生了单击.如果有,则调用onClick(). onClick()执行所有可能的点击共有的功能,因此每次用户点击时都需要调用它.
有时用户可能想要扩展onClick()的功能无论如何要包含原始功能而不复制粘贴它?我能想到的两种方式,我都不喜欢
dojo.declare("MouSEObjectChild",[MouSEObject],onclick : function(){this.inherited(arguments);...}
});
这有一个缺点,我必须继续创建我不需要的新类,并且两个添加一个中间函数
dojo.declare("MouSEObject",{
constructor: function(){},onclick : function(){this._onClick()...},//child onClick
_onClick : function(){...},//parent onClick
__onClick : function(){...} //listener
});
但这看起来不是很好的代码
作为赏金,我需要有关如何最好地解决程序 – 用户交互的专家建议.如果程序提供了一个关键功能,例如在画布上绘制一个圆圈,那么用户如何最好地与之交互.如果用户想在圆圈后面画一个三角形怎么办?圆圈前方的一个正方形?然后该程序必须提供前后方法,如下所示:
beforeDraw();
draw();
afterDraw();
最佳答案
正如“我应该将函数放在自己的数组中并按顺序调用它们”和“构建自己的事件系统”的想法所建议的那样,您可能希望查看扩展标准库中捆绑的dojox.lang.aspect库.它应该基本上是“dojo.connect”解决方案的更高级版本.
dojo.require('dojox.lang.aspect');
var aop = dojox.lang.aspect;
function log(msg){ return function(){
console.log(msg);
};}
var obj = {
draw : log('draw circle');
};
obj.foo();
//prints
// draw circle
aop.advise(obj,'draw',[
{before: log('draw triangle')},{after: log('draw a square')},{after: log('done!')}
]);
obj.foo();
//prints
// draw a triangle
// draw a circle
// draw a square
// done!