我正在帮助一个客户端使用一些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
的调用会回来。
答案 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);