kendo,打字稿-将dataBound事件移至单独的函数以重用

时间:2018-06-28 11:12:33

标签: typescript kendo-ui

我有剑道多重选择元素的下一个代码。

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变量,但是我不确定。

有人可以帮我这个忙吗?

1 个答案:

答案 0 :(得分:0)

dataSource.remove()dataSource.add()触发了“ dataBound”事件(example),因此您的代码是递归的,这就是为什么出现错误“最大堆栈跟踪调用”的原因。您不应该在dataBound事件上更改dataSource。