2013-01-08 71 views
0

我正在使用RPNiemeyer的kendo-knockout庫。我有一個劍道窗口:Kendo-Knockout:可觀察的小部件未填充實際的部件

HTML:

<div data-bind="kendoWindow: {isOpen: isOpen, title:'Language', width: 400, height: 200, modal: true, widget: popUpWindow }" > 
該中心窗口

JavaScript部分:

this.popUpWindow = ko.observable(); 
    self.isOpen.subscribe(function (newValue) { 
     if (newValue) { 
      self.popUpWindow().center(); 
     } 
    }); 

我使用的源代碼,我以前對我的小提琴問題:

Kendo-Knockout: Window does not close correctly

我按照她所示的步驟E:

Kendo-Knockout: How to center window

我定義窗口小部件可觀察的,但是當我想使用它,它不填充實際的小部件。

小提琴: http://jsfiddle.net/dcYRM/15/

與工作示例任何幫助,將不勝感激。

回答

3

貌似有幾個問題:

首先,窗口小部件已灌裝前你isOpen訂閱運行。

其次,在填充小部件後,它正在導致數據源刷新並試圖序列化包含小部件的模型,這是造成問題的原因。這最終是因爲Knockout-Kendo對傳遞給網格的數據進行解包太過激進。

我看到兩個很簡單的方法來解決這個問題。最簡單的方法是爲小部件的open事件和呼叫中心設置一個全局處理程序。

從以前的問題與close事件把這個看起來是這樣的:

ko.bindingHandlers.kendoWindow.options = { 
    close: function() { 
     $('.k-window, .k-overlay').remove(); 
    }, 
    open: function(event) { 
     event.sender.center(); 
    } 
    }; 

現在,只要打開任何窗口將得到集中,你不需要亂用小工具在所有。這裏的示例:http://jsfiddle.net/rniemeyer/F4JGG/

這看起來像是最好的選擇。爲了使它與小部件本身的引用一起工作,您需要在庫中解決問題。如上所述,它有點過於激進並且展開了選項,看起來這會在小部件初始化,小部件參數被傳遞並且已經用小部件填充時導致問題。當我有機會時,我應該可以在圖書館解決它。

否則,你就必須做:

self.popUpWindow = ko.observable(); 
self.popUpWindow.subscribe(function (widget) { 
    if (widget) { 
    widget.center(); 
    self.popUpWindow(null); //hack - Knockout-Kendo should handle this one 
    } 
}); 

所以,清除觀察到你叫center後。以下是一個示例:http://jsfiddle.net/rniemeyer/PVMjy/。我還訂閱了Widget的可觀察對象,所以上面提到的isOpen沒有時間問題。

設置全局open處理程序,似乎是這種情況下最乾淨和最好的選項。

+0

再次感謝您的反饋。我將與第一個場景一起使用,因爲我只需要窗口小部件引用即可。隨着我的項目變得越來越大,越來越複雜,我進入了一些並不完全由這個偉大的圖書館支持的角落案例。是否有另一種方式與您聯繫,因爲我的申請完全依賴於您的圖書館,並且您似乎是最近唯一能夠根據我的經驗回答我的問題的人嗎? – Mdb

+0

你可以在ryan給我發郵件在knockmeout.net –

+0

我已經向你發送了一封在圖書館有可能出現問題的電子郵件。謝謝! – Mdb