这是我正在处理的更复杂事情的简化代码。该代码有效,但其某些部分感觉不正确。我想知道是否有更好的方法来完成此操作的某个部分。
https://jsfiddle.net/fkyly3of/36/
window.getRandomInt = function (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
window.mySingleton = {
runMe: function(obj) {
var uid = getRandomInt(0, 999999);
// START OF CODE IN QUESTION
window.mySingleton['whoAmI' + uid] = function() {
alert(obj.firstName);
};
document.getElementById('x').innerHTML += '<input type="button" onclick="window.mySingleton.whoAmI' + uid + '()" value="Click Me">';
// END OF CODE IN QUESTION
}
};
//simulate launching panel xyz
var person1 = new Object();
person1.firstName = "John";
window['mySingleton']['runMe'](person1);
//simulate launching a second instance of panel xyz
var person2 = new Object();
person2.firstName = "Jane";
window['mySingleton']['runMe'](person2);
我的问题是关于注释之间的代码。当我有一个像这样的JavaScript字符串时,我该如何获取它来引用对象的正确实例?该代码有效,第一个按钮准确地引用了John和第二个参考Jane。但是使用此方法,如果启动了20个面板,则将创建20个whoAmI
的版本。
obj =一个空的dhtmlx窗口。
singleton =进入obj(dhtmlx窗口(的屏幕(网格,表格等(。
我只能在runMe
函数中编辑内容。由于我无法重新搜索我认为上述的一切,除非有人能想到更好的方法。谢谢!
,因为您已经规定了您可以/要更改的代码是runMe
函数,所以我将您的代码更改为类似的内容:
window.mySingleton = {
runMe: function(obj) {
var xElement = document.getElementById('x');
var button = document.createElement('input');
button.type = 'button';
button.value = 'Click Me';
xElement.appendChild(button);
button.onclick = function(){
alert(obj.firstName);
}
// END OF CODE IN QUESTION
}
};
//simulate launching panel xyz
var person1 = new Object();
person1.firstName = "John";
window['mySingleton']['runMe'](person1);
//simulate launching a second instance of panel xyz
var person2 = new Object();
person2.firstName = "Jane";
window['mySingleton']['runMe'](person2);
以这种方式,您将onclick设置为实际函数,而不是将字符串串联在一起以制作具有字符串函数的元素。这是您调用您在runMe
中定义的函数,而无需将该函数实际附加到全局范围。
编辑:忘记添加JSFIDDLE。这里:https://jsfiddle.net/nzifnab/fkyly3of/48/
这就是我要解决这个问题的方式:
<html>
<body>
<div id="x">
</div>
<script>
window.people = [];
window.createButton = {
init: function(obj) {
document.getElementById('x').innerHTML += '<input type="button" onclick="window.createButton.show(' + obj.index + ')" value="Click Me">';
},
show: function(uid) {
console.log(window.people);
alert(window.people[uid].firstName);
}
};
//simulate launching panel xyz
var person1 = new Object();
person1.firstName = "John";
person1.index = window.people.length;
window.people.push(person1);
window.createButton.init(person1);
//simulate launching a second instance of panel xyz
var person2 = new Object();
person2.firstName = "Jane";
person2.index = window.people.length;
window.people.push(person2);
window.createButton.init(person2);
</script>
</body>
</html>
我所做的是不是为每个人创建一个函数,而是创建了一系列人。因此,它实际上是一种视图模型(来自MVVM模式(。然后,createButton
对象是一个不会被克隆的单个对象,但仅充当可重复使用函数的存储库,该函数由您在运行时创建的小部件重新使用。
这是jsfiddle:https://jsfiddle.net/r35zam1e/1/