【发布时间】:2015-06-19 21:58:58
【问题描述】:
我创建了一个包含引导模式对话框的敲除组件,我正在注册和加载(作为 AMD 模块)如下:
// Register dialogs as components
ko.components.register('create-user-dialog', {
viewModel: { require: 'Features/Users/Index/CreateController' },
template: { require: 'text!Features/Users/Index/CreateDialog.html' }
});
模板 HTML 包含如下标签:
<div class="modal fade" id="create-user-modal" tabindex="-1" role="dialog">
...
</div>
淘汰视图模型扩展了一个基类,看起来像这样(打字稿):
export = CreateController
class CreateController extends Controllers.BootstrapModalController {
constructor() {
super($('#create-user-modal'));
}
}
class BootstrapModalController {
public dialog: JQuery;
constructor(dialog: JQuery) {
// Save a reference to the modal element so we can
// show/hide the dialog from the controller
this.dialog = dialog;
}
// Show the modal window
showModal = () => {
this.dialog.modal({
show: true,
backdrop: 'static'
});
}
// Close the modal window
closeModal = () => {
this.dialog.modal('hide');
}
}
最后,我在我的页面中使用组件如下:
<div data-bind="component: 'create-user-dialog'"></div>
这可行,但有点混乱,因为CreateController 在构造函数中做了一些我认为有点奇怪的事情——即使用一个 jquery 选择器,它与模板中的 html 紧密耦合。
在某种程度上,这是不可避免的,但我认为这可能会更好一些。如果可能的话,我希望 BootstrapModalController 基类能够自动确定与 Bootstrap 模态相对应的 DOM 元素......这样 showModal 和 closeModal 就可以工作,只要模板实际上包含引导模式对话框和后代不必在构造函数中显式传入 id 或 jquery 对象。
我认为它可能能够使用类似jQuery find 的方法在组件的HTML 模板中寻找具有CSS 类modal 的元素。但是,为了做到这一点,我需要能够获取 Knockout 绑定组件的视图模型所针对的 rootNode(即<div data-bind="component: 'create-user-dialog'"></div> 元素)。
有没有办法从该组件的 javascript 视图模型中计算出该组件的 html rootNode?
【问题讨论】:
-
处理视图和视图模型之间的绑定是淘汰赛中 bindingHandlers 的职责。我的建议是您的 ViewModel 可以有一个名为
isVisible或类似名称的属性,并且您为模式创建一个 bindingHandler,绑定到该属性。 bindingHandler 提供了您绑定到(来自 ViewModel)的(潜在可观察的)值以及应用了 bindingHandler 的元素。只有 bindingHandler 知道引导 DOM 操作的 API,而不是让 ViewModel 拥有这些知识。 -
谢谢罗伯特。我想我找到了一个解决方案,就像你所说的那样。所以基本上,如果你想在 viewmodel 和 dom 之间(在任一方向)推送东西,绑定处理程序就是答案。
标签: javascript html mvvm knockout.js typescript