我認爲解決您的問題來自以錯誤的方式考慮視圖模型。視圖模型不僅是將數據傳遞給視圖的東西,還是將數據提交回來的佔位符。
我通常最終與knockout合作的方式,我從來沒有最終發送一個空視圖模型到視圖。視圖模型通常具有我綁定的所有字段。儘管它們可能是空字符串,或者是沒有顯示值的初始化對象,但實際的對象仍然會退出,並且每個對象都有適當的表示來與我綁定的字段相關聯。
您可能想要簡單地向視圖發送空對象而不是任何內容。
編輯:這個例子是未ASP.NET MVC
所以basiclaly,我在服務器端,我創建視圖模型對象,其中包含所有需要被顯示的數據以及所有數據需要收集。爲了更簡單的驗證代碼,我通常會將數據收集到它自己的子類中,但這都是代碼需求的問題。
在任何情況下,任何對象都會從vmBase類中獲取inherts,它基本上提供了一個生成對象的JSON序列化的toJSON()方法。這在視圖引擎的視圖中被調用。如下面的代碼所示。
<script type='text/javascript'>
var viewModel = ko.mapping.fromJS(<%= Model.ToJson() %>);
$(document).ready(function() {
ko.applyBindings(viewModel);
});
</script>
當我準備發回代碼時,我只需刪除一個JS版本的視圖模型。
<script type='text/javascript'>
var dataToSendToServer = ko.toJS(viewModel);
</script>
在某些sanarios,其中只有視圖模型的一部分被改變(這是如果你正在做AJAX更新),你可以做一些很酷的東西一樣,切換模板,以便不同的結合可以applyed。在這種情況下,我們使用的是#ID_of_Container作爲原始數據/模板的容器和更換模板(其可以包含數據綁定=「」元件)的新模板ID_of_Template
<script type='text/javascript'>
ko.cleanNode($("#ID_of_Container"));
delete (viewModel.Some_Element_To_Be_Updated);
viewModel = ko.mapping.updateFromJS(viewModel, New_Data_For_That_Element);
// Use ko.toJS(viewModel) because standard template plugin doesn't understand
// knockout observables
$("#ID_of_Container").html($("#ID_of_Template").tmpl(ko.toJS(viewModel)))
ko.applyBindings(viewModel, $("#ID_of_Container")[0]);
</script>
由於RP尼邁耶,我會在接下來的幾天內嘗試了這一點。聽起來很有希望! – MichaelvR
自定義裝訂完美,謝謝! – MichaelvR
的卡斯特init已綁定爲我工作不錯,但我不喜歡數據綁定屬性的綁定的動態更新的,所以我建議使用[virual元素(http://knockoutjs.com/documentation/custom-bindings - 用於虛elements.html)。 \t \t 喜歡的東西: < - KO valueWithInit: 'PropC' - > <輸入數據綁定= 「可見:PropC,值:PropC」> –