2013-10-16 45 views
1

我有一個使用Knockout.js構建的Web應用程序,但是我沒有實現的一件事就是正確的可重用HTML。現在,即使我有一個視圖,如多個其他視圖共享的對話框,我也必須複製並粘貼HTML代碼並將其嵌套在父代中,以實現子代與父代之間的正確綁定通信。如何創建ViewModel事件模式

下面是一個例子:

<div class="person-view"> <!-- PersonViewModel --> 
    <div class="person-details"> 
     <!-- Person details --> 
    </div> 
    <button type="button" data-bind="click: EditAddress">Edit address</button> 
    <div class="modal hide fade" role="dialog" data-bind="modal: ShowEditAddressModal, with: Address"> <!-- AddressViewModel --> 
     <div class="modal-header"> 
      <h3>Edit address</h3> 
     </div> 
     <div class="modal-body"> 
      <!-- Address details --> 
     </div> 
     <div class="modal-footer"> 
      <button class="btn" data-dismiss="modal">Cancel</button> 
      <button class="btn btn-danger" data-dismiss="modal" data-bind="click: function() { $parent.SetAddress($data); }">Save</button> 
     </div> 
    </div> 
</div> 

在這種情況下,我有一個子視圖模型,我正在爲模態格設置爲DataContext的。當用戶單擊Save按鈕時,我正在調用父DataContext上的一個方法。

我知道如何將模態分解爲單獨的HTML模板並生成動態提供ViewModel的模板。這將工作顯示和隱藏的模式,因爲我只需要從父的代碼中執行以下操作:

this.Address().IsShown(true);

在這種情況下,模式將其知名度只是綁定到一個屬性上本身父母只需要改變它。沒關係。

但是,如何點擊保存按鈕?我沒有看到如何讓父母使用Knockout.js的MVVM模式來響應此事件。該按鈕仍然需要綁定到AddressViewModel上的任意代碼的click綁定,但是如何使用Knockout向其父級發送事件信號?

有沒有辦法與Knockout做到這一點,我是否需要實現一個單獨的庫,如Underscore.js的事件?

+0

您可能需要在視圖/視圖模型中使用原型,並將回調傳遞給視圖模型。這樣你可以從任何其他視圖實例化它,並讓它在關閉時回調給父節點。 –

回答

0

這不是直接回答你的問題,但你試圖解決的問題可以通過使用類似DurandalJS這樣的庫來消除,它建立在挖空之上並處理視圖組合。 Durandal提供了許多功能,可以讓您尋找的代碼重用,而無需重新發明輪子。這不適合每個項目,但它可能適合您的需求。

相關問題