IIFE 中的空数组
empty array in IIFE
我正在尝试在 header 中为 jsgrid 中的所有行选择添加一个复选框,如图 here 所示。它工作正常。但是,我尝试将这些函数放在 IIFE 中,而不是将所有代码放在一个页面中,如下所示。
var jsgridCheckBox = (function() {
var selectedItems = [];
var selectItem = function(item) {
selectedItems.push(item);
...
};
var unselectItem = function(item) {
selectedItems = $.grep(selectedItems, function(i) {
return i !== item;
});
...
};
var selectAllCheckBox = function(item) {
selectedItems = [];
if (this.checked) {
...
}
};
return {
selectedItems: selectedItems,
selectItem: selectItem,
unselectItem: unselectItem,
selectAllCheckBox: selectAllCheckBox
}
})();
在 JSGrid 中,
$(function() {
$("#jsGrid").jsGrid(
...
fields: [
itemTemplate: function(_, item) {
return $("<input>").attr("type", "checkbox").attr("class", "singleCheckbox")
.prop("checked", $.inArray(item, jsgridCheckBox.selectedItems) > -1)
.on("change", function() {
$(this).is(":checked") ? jsgridCheckBox.selectItem(item) : jsgridCheckBox.unselectItem(item);
});
}
...
]
});
});
选中复选框后,当我尝试如下调用它时
var dialog = $("#dialog-form").dialog({
buttons: {
"Reject": rejectRequest,
}
});
function rejectRequest() {
alert(jsgridCheckBox.selectedItems.length);
for (var i = 0; i < jsgridCheckBox.selectedItems.length; i++) {
alert(jsgridCheckBox.selectedItems[i].some_id);
...
}
...
}
它总是 returns 0
。是不是 jsgridCheckBox
总是 returns 一个新实例?如何在 IIFE 中维护数组的状态?
您在闭包中有一个私有变量 selectedItems
,并且您在名为 selectedItems
的对象上也有一个 属性。那会造成混乱。 属性 的初始值只是一个空数组。当复选框被选中或取消选中时,selectedItems
会 重新分配 与您的 =
;它不再引用您的原始数组。仅当相关数组发生 突变 时,引用才会保留(这不是一个值得依赖的好主意)。
您可以定义一个 getter 函数,returns 当前对数组的引用:
var jsgridCheckBox = (function(){
var selectedItems = [];
var selectItem = function(item) {
selectedItems.push(item);
};
var unselectItem = function(item) {
selectedItems = $.grep(selectedItems, function(i) {
return i !== item;
});
};
var selectAllCheckBox = function(item) {
selectedItems = [];
if(this.checked) {
}
};
return{
getSelectedItems : () => selectedItems,
selectItem : selectItem,
unselectItem : unselectItem,
selectAllCheckBox :selectAllCheckBox
}
})();
或者您始终可以将数组作为对象的 属性 引用,而不是作为独立变量:
var jsgridCheckBox = (function(){
var selectItem = function(item) {
this.selectedItems.push(item);
};
var unselectItem = function(item) {
this.selectedItems = $.grep(this.selectedItems, function(i) {
return i !== item;
});
};
var selectAllCheckBox = function(item) {
this.selectedItems = [];
if(this.checked) {
}
};
return{
selectedItems : [],
selectItem : selectItem,
unselectItem : unselectItem,
selectAllCheckBox :selectAllCheckBox
}
})();
我正在尝试在 header 中为 jsgrid 中的所有行选择添加一个复选框,如图 here 所示。它工作正常。但是,我尝试将这些函数放在 IIFE 中,而不是将所有代码放在一个页面中,如下所示。
var jsgridCheckBox = (function() {
var selectedItems = [];
var selectItem = function(item) {
selectedItems.push(item);
...
};
var unselectItem = function(item) {
selectedItems = $.grep(selectedItems, function(i) {
return i !== item;
});
...
};
var selectAllCheckBox = function(item) {
selectedItems = [];
if (this.checked) {
...
}
};
return {
selectedItems: selectedItems,
selectItem: selectItem,
unselectItem: unselectItem,
selectAllCheckBox: selectAllCheckBox
}
})();
在 JSGrid 中,
$(function() {
$("#jsGrid").jsGrid(
...
fields: [
itemTemplate: function(_, item) {
return $("<input>").attr("type", "checkbox").attr("class", "singleCheckbox")
.prop("checked", $.inArray(item, jsgridCheckBox.selectedItems) > -1)
.on("change", function() {
$(this).is(":checked") ? jsgridCheckBox.selectItem(item) : jsgridCheckBox.unselectItem(item);
});
}
...
]
});
});
选中复选框后,当我尝试如下调用它时
var dialog = $("#dialog-form").dialog({
buttons: {
"Reject": rejectRequest,
}
});
function rejectRequest() {
alert(jsgridCheckBox.selectedItems.length);
for (var i = 0; i < jsgridCheckBox.selectedItems.length; i++) {
alert(jsgridCheckBox.selectedItems[i].some_id);
...
}
...
}
它总是 returns 0
。是不是 jsgridCheckBox
总是 returns 一个新实例?如何在 IIFE 中维护数组的状态?
您在闭包中有一个私有变量 selectedItems
,并且您在名为 selectedItems
的对象上也有一个 属性。那会造成混乱。 属性 的初始值只是一个空数组。当复选框被选中或取消选中时,selectedItems
会 重新分配 与您的 =
;它不再引用您的原始数组。仅当相关数组发生 突变 时,引用才会保留(这不是一个值得依赖的好主意)。
您可以定义一个 getter 函数,returns 当前对数组的引用:
var jsgridCheckBox = (function(){
var selectedItems = [];
var selectItem = function(item) {
selectedItems.push(item);
};
var unselectItem = function(item) {
selectedItems = $.grep(selectedItems, function(i) {
return i !== item;
});
};
var selectAllCheckBox = function(item) {
selectedItems = [];
if(this.checked) {
}
};
return{
getSelectedItems : () => selectedItems,
selectItem : selectItem,
unselectItem : unselectItem,
selectAllCheckBox :selectAllCheckBox
}
})();
或者您始终可以将数组作为对象的 属性 引用,而不是作为独立变量:
var jsgridCheckBox = (function(){
var selectItem = function(item) {
this.selectedItems.push(item);
};
var unselectItem = function(item) {
this.selectedItems = $.grep(this.selectedItems, function(i) {
return i !== item;
});
};
var selectAllCheckBox = function(item) {
this.selectedItems = [];
if(this.checked) {
}
};
return{
selectedItems : [],
selectItem : selectItem,
unselectItem : unselectItem,
selectAllCheckBox :selectAllCheckBox
}
})();