首先 - 我对 JQuery 小部件没有完全了解。我将它们视为可以独立保存状态和表示的对象。我用于设计的示例来自微软的“SILK”项目。
问题 - 当我忙于为新站点创建可视元素作为 JQuery 小部件时,一切都很顺利,直到我用小部件初始化了 1 个以上的元素。与其他一切相比,实例变量(数组)似乎是全局的。所以我创建了一个简单的测试项目来演示行为:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.9.2.min.js"></script>
<script type="text/javascript">
(function ($, undefined) {
$.widget('AR.MultiQueue', {
options: {
queueName: "",
Names: [],
Wrong: [],
Right: []
},
_create: function () {
var temp = [];
for (var i = 0; i < this.options.Names.length; i++) {
console.log('pushing ' + this.options.Names[i] + ' for ' + this.options.queueName);
this.options.Wrong.push(this.options.Names[i]);
temp.push(this.options.Names[i]);
}
this.options.Right = temp;
},
Test: function () {
console.log(this.options.queueName);
for (var i = 0; i < this.options.Names.length; i++)
console.log('Name->' + this.options.Names[i]);
for (var i = 0; i < this.options.Wrong.length; i++)
console.log('Wrong->' + this.options.Wrong[i]);
for (var i = 0; i < this.options.Right.length; i++)
console.log('Right->' + this.options.Right[i]);
},
destroy: function () {
$.Widget.prototype.destroy.apply(this, arguments);
}
});
}(jQuery));
</script>
</head>
<body>
<div id="a"></div>
<div id="b"></div>
<script type="text/javascript">
(function () {
$('#a').MultiQueue({ queueName: 'a', Names: ["a"] });
$('#b').MultiQueue({ queueName: 'b', Names: ["b"] });
setTimeout(function () {
$('#a').MultiQueue('Test');
console.log('Next widget');
$('#b').MultiQueue('Test');
}, 1000);
})();
</script>
</body>
</html>
所以我期望的输出是每个小部件只打印出相应的(“a”或“b”)数组字符串 3 次。相反,输出是:
pushing a for a
pushing b for b
a
Name->a
Wrong->a
Wrong->b
Right->a
Next widget
b
Name->b
Wrong->a
Wrong->b
Right->b
如您所见,两个小部件都为使用直接实例变量“push”的数组打印出“a”和“b”。现在我只是重写我的小部件以使用临时数组对象,如示例中的“Right”选项 var,但我觉得 jQuery 小部件还有更多我可以理解的东西(如,我是否按照我的方式编写代码?应该???)
我在网上搜索了这个,但我唯一能想到的是
- 不要使用 jQuery PLUGINS 作为实例
- jQuery 小部件存储在数组中
- 事实上我从来没有真正理解 javascript 中的数组(因为事实数组已经修复大小,最接近的是 C# 中的 List<>)。
无论如何,我真的很想知道为什么会这样(如果我能期待更多这些惊喜,这需要一些时间才能找到)
谢谢