我認爲這種情況是非常適合採用淘汰賽客戶端解決方案,正如你在第一次提出的解決方案中提到。 Knockout使得以聲明方式進行這種客戶端UI操作變得非常簡單。用戶完成表單後,只需將客戶端視圖模型對象序列化爲JSON並將其發佈到服務層。
您的第二個建議的解決方案不太引人注目。在它的缺點是:
- 它需要一個服務器回發只是爲了更新UI,這是一個不太理想的用戶體驗
- 你的服務器的域模型現在必須有一個工作和堅定的模式,這更增加了複雜性
用於與敲除和客戶端側使用MVVM模式的javascript視圖模型實現此的碼是相當簡單:
<div data-bind = "text: name"></div>
<input type="radio" name="citizenship" value="yes" data-bind="checked: citizenship">South African Citizen<br/>
<input type="radio" name="citizenship" value="nowithoutworkpermit" data-bind="checked: citizenship">Non South African, no work permit<br />
<input type="radio" name="citizenship" value="nowithworkpermit" data-bind="checked: citizenship">Non South African, with work permit<br />
<div id="workpermit" data-bind="visible: citizenship() === 'nowithworkpermit'">
<input type="text" name="workpermitinumber" />Work Permit number
</div>
<script src="/Scripts/knockout-2.2.0.js" ></script>
<script>
var MyApp = MyApp || {};
MyApp.ViewModel = {
citizenship: ko.observable(""),
name: ko.observable("John")
};
ko.applyBindings(MyApp.ViewModel);
</script>
在這個例子中,我在MyApp.ViewModel中創建了一個視圖模型。該模型有兩個屬性:名稱和公民身份。我已經將「公民身份」屬性數據綁定到無線電對講機的「已檢查」屬性,並且也顯示了顯示工作許可證編號的文本框的「可見」屬性。
當用戶檢查單選按鈕時,淘汰賽將更新視圖模型的「公民身份」屬性。視圖模型屬性中的這種更改反過來會通過敲除「visibile」綁定來更新workpermit div的可見性css屬性。當用戶準備好提交表單時,只需將MyApp.ViewModel序列化爲JSON並通過網絡發送。
淘汰賽的文檔非常出色(see here),我認爲這將是您嘗試完成的最佳選擇。
謝謝@Joe,我懷疑淘汰賽會勝利。我現在需要使用一些助手來正確呈現輸入上的JS視圖模型和額外的挖空屬性。 – ProfK