我有剑道多重选择元素的下一个代码。
var newitemtext: string;
var multiselect = t.sender.element.find("#redirectUris-multiselect").kendoMultiSelect({
dataTextField: "text",
dataValueField: "value",
change() {
ClientApplicationsGrid.prototype.changeFuncForMultiselect(this, multiselect);
},
dataBound() {
if ((newitemtext || this._prev) && newitemtext !== this._prev) {
newitemtext = this._prev;
let dataitems = this.dataSource.data();
for (let i = 0; i < dataitems.length; i++) {
const dataItem = dataitems[i];
if (dataItem.value !== dataItem.text) {
this.dataSource.remove(dataItem);
}
}
dataitems = this.dataSource.data();
let found = false;
for (let i = 0; i < dataitems.length; i++) {
const dataItem = dataitems[i];
if (dataItem.value === newitemtext) {
found = true;
}
}
if (!found && newitemtext !== "") {
this.dataSource.add(
{ text: newitemtext + " (Add New)", value: newitemtext });
this.open();
}
}
}}).data("kendoMultiSelect");
我已经成功地将代码从change()事件移动到单独的函数ClientApplicationsGrid.prototype.changeFuncForMultiselect(this,multiselect)。 我需要以某种方式对dataBound()事件做同样的事情,因为在另一个地方我将拥有几乎相同的多重选择,并且我想重用代码。但是,当我执行与change()相同的操作时,得到了“最大堆栈跟踪调用”。我猜是因为我在dataBound()中使用了newitemtext变量,但是我不确定。
有人可以帮我这个忙吗?
答案 0 :(得分:0)
dataSource.remove()
和dataSource.add()
触发了“ dataBound”事件(example),因此您的代码是递归的,这就是为什么出现错误“最大堆栈跟踪调用”的原因。您不应该在dataBound事件上更改dataSource。