2014-03-27 70 views
0

我將kendo庫升級到2014Q1框架,它有一些很好的功能,他們正在添加,但是當我這樣做時,它打破了任何部件(網格,tabStrip,選擇列表等)從渲染。我追蹤到佈局/視圖不能在沒有被setTimeout設置爲0的情況下封裝的情況下激活widget。我是否在這裏丟失了某些關鍵字,或者我是否以無效的方式構建了這個東西?Kendo佈局不渲染小部件沒有setTimeout

http://jsfiddle.net/upmFf/

我有低於(去掉註釋和它的作品)問題的基本思路:

var router = new kendo.Router(); 
var mainLayout = new kendo.Layout($('#mainLayout').html()); 
var view = new kendo.View('sample', { 
    wrap: false, 
    model: kendo.observable({}), 
    init: function() { 
      // setTimeout(function(){ 
       $("#datepicker").kendoDatePicker(); 
      // }, 0); 
    } 
}); 

mainLayout.render('#container'); 

router.route('/', function() { 
    mainLayout.showIn('#app', view); 
}); 

router.start(); 

回答

0

誠然,我不完全理解,但希望這有助於。

基本上,當您嘗試初始化時,視圖元素尚未被插入到DOM中。你可以在init函數內部放置一個斷點,當它打到時,檢查DOM,你會看到#app是一個空的div,並且還沒有存在(至少不在DOM上)。

kendo.Layout.showIn似乎需要退出以便視圖完成呈現,但是當它初始化視圖的元素時,它認爲渲染已完成,並且init提前未正確觸發。 setTimeout的工作原理是因爲它運行kendoDatePicker初始化異步,視圖能夠在超時功能之前完成渲染。

解決辦法...

觸發視圖從視圖對象本身的渲染:

var view = new kendo.View('sample', { 
    init: function() { 
     $("#datepicker").kendoDatePicker(); 
    } 
}); 
router.route('/', function() { 
    view.render('#app'); 
}); 

選擇並找到視圖對象本身的日期選擇器:

var view = new kendo.View('sample', { 
    init: function() { 
     view.element.find("#datepicker").kendoDatePicker();   
    } 
}); 
router.route('/', function() { 
    mainLayout.showIn('#app', view); 
}); 

this thread的底部是我得到第二個選項的想法。也許別人可以回來,給出更好的解釋。

+0

是的,我同意你我運行了一堆測試結果相同,直到上述解決方案之一實現或使用'data-role =「datepicker」',該元素才存在。我喜歡'view.element.find'方法,但是像setTimeout或使用data-role來初始化項目是一個bandaid解決方案,至少當佈局應該像2013年的庫中那樣處理這個問題時:http:// jsfiddle.net/k2PWB/。我會解決這個問題,比如在init的頂部調用super,以確保init設置代碼完全運行。 – JakeTheBraek

+0

@JakeTheBraek同意,這是一個最好的解決方案,除非這是一個有意的突破性改變。我發現另一個奇怪的是,文檔聲稱Layout.ShowIn將觸發kendo.View的'show'事件。所以我試圖在顯示事件中初始化日期選擇器,但它甚至沒有觸發事件。 – gitsitgo

+1

是的,我也認爲它與init方法處於同一級別,拋棄它,無法調用,與你想象的一樣。看起來整個佈局管理器機制充其量只是一個事後考慮。希望當我的公司開始爲完整的許可證付款時,我可以以更正式的方式得到這些問題的答案。我很感激你的幫助,儘管@ gitsitgo總是很高興知道我不會發瘋:) – JakeTheBraek