サーバーに投稿するデータのクライアント側のコレクションを構築しています。[追加]ボタンのonClickイベントを使用して、フォームデータを収集し、内部配列に格納しています。これは、問題を実証するための偽の/サンプルコードです(残念ながら、ソースを共有することはできません)。
var getDataFromForm = (function() {
var _internal = {}; /* Based on feedback, I think this is the reason for the behavior I'm experiencing */
return function() {
var form = {};
/* Get the form data */
_internal.name = form.name;
_internal.id = form.id;
return _internal;
};
}());
var internal = { vals: [] };
function onClick() {
var newData = getDataFromForm();
doAjaxValidation({
success: function() {
internal.vals.push(newData); /* All values in array have been updated to this newData reference on click */
internal.vals.push( JSON.parse(JSON.stringify(newData)) ); /* ugly, but the reference is broken and future clicks work as expected */
internal.vals.push( $.extend({}, newData) ); /* reference to the object is still persisted through jQuery's extend */
}
});
}
各ボタンクリックnewData
の新しい割り当てに参照が渡される理由について、私は混乱しています。newData
各クリックイベントは新しい関数呼び出しであり、 (理論的には)他のボタンクリックnewData
とは関係のない新しいオブジェクトである必要があります。newData
私は何が欠けていますか?
編集:このサンプルははるかに大きなコードブロックからのものであり、可能な限り単純な式に縮小しようとしました。明らかに、現状では、これは機能的なコードではありません。