2014-02-26 62 views
1

我正在幫助客戶解決一些KendoUI問題,我們正在使用樹視圖來實現組織層次結構。展開Treeview promise

他們在樹上方有一個搜索框(自動完成),當他們選擇某人時,它展開樹,在樹中找到它們並選擇它們,如果它們不在視圖中(treeview在滾動div)它將它們滾動到視圖中。

我遇到的問題是,我的scrollTop動畫發生在treeview完成擴展之前。 (我要指出,我打開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); 

如果我超時包裹animate(約。300密耳),它適用於中等規模的組織,但如果我們有一個大的組織,可能沒有足夠的時間

會是什麼更好的是,如果我能打入一個承諾我想:

treeView.expand('.k-item').promise().done(//animate); 

甚至嘗試將expand換成deferpromise的函數,但在樹完全展開之前調用expand

回答

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); 
+0

我曾嘗試在一個承諾包裹,並沒有爲我工作。雖然沒有擴展樹視圖,因爲樹視圖並沒有真正的遞歸擴展,我自己也是這樣做的。 :0)我會嘗試這個。我最終使用超時,問題是,我不知道樹會有多大(這是一些大公司的組織結構圖)。我使用的超時時間是300,它適用於節點少於1000的樹。謝謝! – leebrandt

+0

如果您可以創建演示,我可以再看看它;如果loadOnDemand爲false,則展開(「.k-item」)應該一次性展開所有內容,不管樹有多大 –