いくつかのdivを動的に作成したいと思います。各divがオブジェクトJS - 動的に作成されたdivコンテナに間違ったデータオブジェクトが含まれています
function node(id, title, content, isPrivate, dateOfCreation) { // my node object
this.id = id;
this.title = title;
this.content = content;
this.isPrivate = isPrivate;
this.dateOfCreation = dateOfCreation;
this.lastEdited = dateOfCreation;
}
が含まれており、このオブジェクトは
var store = new dataStore(); // instance of the store
function dataStore() {
this.nodes = []; // all the node objects
this.getNodes = function() { // get all objects
return this.nodes;
}
this.addNode = function(node) { // add a new object
addElementToArray(this.nodes, node);
}
this.deleteNode = function(node) { // delete an object
deleteElementFromArray(this.nodes, node)
}
this.getNodeById = function(nodeId){ // find an object by its id
for(var i = 0; i < this.nodes.length; i++){
if(nodeId == this.nodes[i].id)
return this.nodes[i];
}
return null;
}
this.getNodeTitle = function(node){ // get the title of the node
return node.title;
}
}
は、だから私はいくつかのdivを、オブジェクトごとに1つのdiv要素を作成したい私のデータストアクラスによって管理されています。
function initNodeView() { // build up all the divs
for (var i = 0; i < 30; i++) { // -- TEST -- Fill the store
store.addNode(new node(i, i, i, i % 2 == 0, i));
}
var nodes = store.getNodes(); // get all the nodes from the store
for (var i = 0; i < nodes.length; i++) {
var currentNode = nodes[i]; // the current object
var nodeContainer = createDiv('#nodeList', "nodeContainer"); // the wrapperdiv
createDivWithText(nodeContainer, "nodeContentDiv", store.getNodeTitle(currentNode)); // create a child div with the title of the object
var barContainer = createDiv(nodeContainer, "nodeBtnBarDiv"); // create a childdiv - the container of all buttons
createDivWithIcon(barContainer, "nodeIcon", currentNode.isPrivate ? "'foo.png'" : "'bar.png'"); // create an icon div
var btnDefaultCss = "nodeBtn"; // default css class for buttons
createBtn(barContainer, btnDefaultCss, "Edit", function() {
// empty ..
});
createBtn(barContainer, btnDefaultCss, "Delete", function() {
nodeContainer.remove(); // remove this container from the DOM
store.deleteNode(currentNode); // delete this object from the store
});
}
}
私のコードをリファクタリングするために、いくつかのヘルパ関数を構築しました。
function createDiv(parent, cssClass){ // create default div
var divElement = $("<div></div>");
divElement.addClass(cssClass);
$(parent).append(divElement);
return divElement;
}
function createDivWithText(parent, cssClass, text){ // create div with text
var divElement = createDiv(parent, cssClass);
divElement.html(text);
return divElement;
}
function createDivWithIcon(parent, cssClass, iconSource){ // create icon div
var divElement = createDiv(parent, cssClass);
var icon = $("<img src='"+ iconSource +"'/>");
divElement.append(icon);
return divElement;
}
function createBtn(parent, cssClass, text, fn){ // create a new button
var btn = $("<button></button>");
btn.addClass(cssClass);
btn.html(text);
btn.click(function() {
fn();
});
$(parent).append(btn);
}
私の問題は、initNodeView()を呼び出すとき、divコンテナがうまく構築されていることです。しかし、ボタン(編集または削除)をクリックしてこのコンテナの保存されたオブジェクトをログに記録するときは、そのオブジェクトには常に最後のオブジェクトが保存されます。
したがって、30個のオブジェクトと30個のdivコンテナを作成すると、すべて30番目のオブジェクトが格納されます。
通常div要素1は、対象物1、ディビジョン2のオブジェクト2を持つ必要があります....
が重複する可能性のを使用することができます[JavaScriptのクロージャは内部ループ - 簡単な実用例](https://stackoverflow.com/questions/750486/javascript- closure-inside-loops-simple-practical-example) – Andreas
'addElementToArray'の内容を共有できますか?また、[MVCE](https://stackoverflow.com/help/mcve)を提供するために問題を引き起こさない関数を取り除くことは可能でしょうか? –
@MaazSyedAdeeb 'addElementToArray'は(おそらく' Array.push'のような)単なる例です。問題は関数のスコープで、ちょうど95のように答えました。 @ Question3rクラス名はJS規約で大文字になります。https://stackoverflow.com/a/5640506/4621141 – flen