我有一个使用 Knockout.js 构建的 Web 应用程序,但我未能实现的一件事是正确的可重用 HTML。现在,即使我有一个视图(例如由多个其他视图共享的对话框),我也必须复制和粘贴 HTML 代码并将其嵌套在父级中,以实现子级和父级之间的正确绑定通信。
这是一个例子:
<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>
在这种情况下,我有一个子 ViewModel,我将其设置为模态 div 的 DataContext。当用户单击“保存”按钮时,我正在调用父 DataContext 上的方法。
我知道如何将模态分解为单独的 HTML 模板并生成动态提供 ViewModel 的模板。这将适用于显示和隐藏模式,因为我只需要在父代码中执行以下操作:
this.Address().IsShown(true);
在这种情况下,模式将简单地将其可见性绑定到自身的属性,而父级只需要更改它。没关系。
但是,当我单击“保存”按钮时呢?我看不到如何让父母使用 Knockout.js 的 MVVM 模式来响应这种情况。该按钮仍需要click
绑定到 AddressViewModel 上的任意代码的绑定,但它如何使用 Knockout 向其父级发送事件信号?
用 Knockout 没有办法做到这一点,我是否需要为事件实现一个单独的库,例如 Underscore.js?