展开Treeview承诺

时间:2014-02-26 20:20:54

标签: jquery kendo-ui treeview kendo-treeview

我正在帮助一个客户端使用一些KendoUI的东西,我们正在使用树视图来组织层次结构。

他们在树上方有一个搜索框(自动完成),当他们选择某人时,它会扩展树,在树中找到它们,选择它们以及它们是否在视图之外(树视图是可滚动的{{1} }),它将它们滚动到视图中。

我遇到的问题是,我的scrollTop动画正在树视图完成扩展之前发生。 (我应该提一下,我在树上关掉了div(现在),以loadOnDemand加快整个树的扩展。

一些代码:

expand('.k-item'))

如果我将//in the autocomplete select event handler: treeView.expand('.k-item'); treeView.select(selectedItem); var treeTop = treeView.element.offset().top, elTop = treeView.select().offset().top, offsetDiff = elTop - treeTop; treeView.element.animate({scrollTop: offsetDiff}, 100); 包裹在超时(约300密耳)中,它适用于中型组织。但是,如果我们有一个可能没有足够时间的大型组织。

如果我可以接受承诺,那会更好。我试过了:

animate

甚至尝试在treeView.expand('.k-item').promise().done(//animate); expand的函数中包装defer,但在树完全展开之前,promise的调用会回来。

1 个答案:

答案 0 :(得分:0)

我认为将setTimeout的值设置为大于options.animation.expand.duration所传递的值应该足够了(我认为设置默认为200)。

如果你想将expand方法包装在一个承诺中,我认为这样的事情应该有效:

kendo.ui.TreeView.fn.expand = (function(expand) {
    return function(nodes) {
        var that = this,
            deferred = $.Deferred(),
            animationDuration = this.options.animation.expand.duration;

        setTimeout(function() {
            expand.call(that, nodes);
            setTimeout(function() {
                deferred.resolve();
            }, 5 + animationDuration);
        }, 5);

        return deferred.promise();
    }
})(kendo.ui.TreeView.fn.expand);