我在javascript中使用Classy库进行OOP编程。
我编写了一个处理DIV元素上的canvas操作的类。由于代码的某些部分存在一些困难,我必须在类中使用对象变量名,即使它违反了OOP方法。
例如:
drawer=new CanvasManager("div1",300,300);
var CanvasManager= Class.$extend({
blabla:function()
{
drawer.id=1;
}
});
现在我需要在不同DIV的一个文档中不止一次使用这个类,这种冲突使它变得不可能。我只有使用iframe元素来解决它们。
直到我想从 codeigniter视图而非控制器获取iframe内容时才可以。
想要使用类似的东西
<iframe class="iframeclass1">
<?php
echo $this->load->view('gallery/w2',array('item'=>$amount),true);
?>
</iframe>
而不是
<iframe class="iframeclass1" src="<?php echo base_url(); ?>index.php/gallery/w2c/<?php echo $item->amount; ?>">
</iframe>
那么我们还有什么其他解决方案才能解决这个对象名冲突?
修改:
如果你问为什么一开始就用这种方式编写代码,一些jquery函数不允许你传递参数(例如each())。实际上只有bind()函数允许参数传递,这有助于很多。如果你知道任何解决方案我会很高兴。
EDIT2
困难在于此 让我们说blabla功能就像
blabla:function()
{
$('.somediv').each(function()
{
$(this).html(drawer.id);
}
)
}
在每个函数中,“this”关键字成为jquery选择器的指针。
答案 0 :(得分:1)
var appInstances = new array();
var keys = new array();
var id;
keys [0]['id'] = 'div1';
keys [0]['w'] = '300';
keys [0]['h'] = '300';
keys [1]['id'] = 'div2';
keys [1]['w'] = '300';
keys [1]['h'] = '300';
id = 0;
appInstances[id] =CanvasManager(keys[id]['id'] , keys[id]['w'] , keys[id]['h']);
id = 1;
appInstances[id] =CanvasManager(keys[id]['id'] , keys[id]['w'] , keys[id]['h']);
var CanvasManager= Class.$extend({
blabla:function()
{
appInstances[id].id=1;
}
});
答案 1 :(得分:1)
解决方案是使用javascript闭包。 例如: http://jsfiddle.net/C7yen/
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<script>
obj={
id:1,
set:function()
{
setF=(function(ev){ return function(){ $(this).html(ev.id) } })(this);
$('li').each(
setF
);
}
}
window.onload=function()
{
obj.set()
}
</script>
答案 2 :(得分:0)
创建一个单例类来管理给定div上的类的定义。还有为什么在创建对象时给出整个类?这不是OOP的主要想法吗?