2012-07-12 23 views
3

我的問題很簡單。是下面的代碼,似乎工作得很好(點擊here看到一個工作小提琴),實際上是一個有效的使用ko.applyBindings或有副作用和/或問題,可能表面?我可以使用尚未注入DOM的元素調用Knockout的ko.applyBindings嗎?

var viewModel = { 
    sampleText: ko.observable('hello world!') 
}; 

// this HTML would be loaded from the server 
var htmlWithBindings = '<b data-bind="text: sampleText"></b>'; 
var jQueryObj = $(htmlWithBindings); 

ko.applyBindings(viewModel, jQueryObj.get(0)); 
$('#main').append(jQueryObj); 

這種方法的好處是,你可以將所有綁定到HTML 之前,你居然把它添加到DOM,這樣你就不會得到你看空的HTML的這種效果在約束生效之前第二秒。任何理由不這樣做?

+0

看起來像一個聰明的方式來做到這一點!我不想說他們是否有任何不利的原因來做這件事......看到專家說什麼會很有趣。我在等RP尼邁耶的想法! ;) – Phil 2012-07-12 20:57:40

回答

3

Knockout中的處理邏輯與綁定中使用的計算的observables相關,當它認爲元素不再是DOM的一部分時,它將運行。就你而言,你可能無意中觸發了這個邏輯,綁定可能會被處置。

以下是一個示例,在將元素綁定到可觀察元素的情況下,將該可觀察元素更新爲select元素上的value綁定的一部分。 http://jsfiddle.net/rniemeyer/X8RVP/4/

經過一番進一步的研究,我不認爲你的技術在每種情況下都會失敗,但我會意識到上面列出的事情。

您可以選擇在應用綁定時隱藏元素,或者在主要部分使用命名模板(在腳本標記中),以便在綁定元素之前不顯示元素。

命名模板幫助,你永遠不會看到你的「模板」獲得可能呈現像您可以使用控制流綁定(ifwithforeach),甚至綁定的只是正常的元素。它並不一定會阻止你試圖阻止的問題,但它肯定可以提供幫助,因爲綁定會在元素添加到DOM時發生。考慮這個與命名模板:http://jsfiddle.net/rniemeyer/X8RVP/5/與這一個沒有http://jsfiddle.net/rniemeyer/X8RVP/6/。在setTimeout中應用綁定來模擬頁面加載和DOM準備就緒中的一些延遲。

+0

感謝您的快速響應。使用這種方法可能會出現問題,但您提供的示例小提琴實際上並未強調此問題。你的例子的問題是,你只是在第一個粗體標籤上調用applyBindings,所以當然第二個粗體標籤沒有被綁定。如果你圍繞這兩個粗體標籤打包div,例如:[http://jsfiddle.net/X8RVP/3/](http://jsfiddle.net/X8RVP/3/),那麼該示例工作得很好。另外,您是否可以詳細說明如何使用命名模板來解決「空白HTML」問題?謝謝。 – Paulito 2012-07-13 12:51:14

+0

你絕對正確的樣品。我應該仔細看看。我更新了迴應以顯示突破樣本,並顯示我對命名模板的含義。 – 2012-07-13 13:36:13

相關問題