当我从列表中选择项目时,我需要显示用于在单页面应用程序中编辑项目的模态对话框。
问题:我使用visible
绑定,但结果很麻烦,并且它无法正常工作,因为它只显示对话框,没有叠加,淡入淡出(如果有的话)不起作用。
HTML:
<div class="modal hide fade" data-bind="visible:selectedItem, with:selectedItem">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 data-bind="text:name"></h3>
</div>
<div class="modal-body">
<form data-bind="submit:deselectItem">
<!-- editor for item here -->
</form>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-bind="click:deselectItem">Close</a>
</div>
</div>
这个模型是带有observableList,obervable selectedItem和deselectItem函数的简单对象,它将selectedItem设置为null。
答案 0 :(得分:41)
正如我所知,(可能)最好的方法是创建一个ko绑定处理程序,我称之为showModal
:
ko.bindingHandlers.showModal = {
init: function (element, valueAccessor) {},
update: function (element, valueAccessor) {
var value = valueAccessor();
if (ko.utils.unwrapObservable(value)) {
$(element).modal('show');
// this is to focus input field inside dialog
$("input", element).focus();
}
else {
$(element).modal('hide');
}
}
};
用法是这样的:
<div class="modal hide fade" data-bind="showModal:selectedItem, with:selectedItem">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 data-bind="text:name"></h3>
</div>
<div class="modal-body">
<form data-bind="submit:deselectItem">
<!-- editor for item here -->
</form>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-bind="click:deselectItem">Close</a>
</div>
</div>
答案 1 :(得分:5)
我喜欢Gorans的简单方法。唯一的问题是,html在Bootstrap 3+中不起作用。
“隐藏”类现在默认启用,并且在模态div上将其作为类,将导致div不显示。见http://www.bootply.com/bootstrap-3-migration-guide
这有效:
<div class="modal fade" data-bind="showModal:selectedItem, with:selectedItem">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 data-bind="text:TextItem"></h3>
</div>
<div class="modal-body">
<form data-bind="submit:$root.accept">
<!-- editor for item here -->
<div class="form-group">
<label>Text</label>
<input type="text" class="form-control" data-bind="value: TextItem" placeholder="Text">
</div>
</form>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal">Luk</button>
<button class="btn" data-bind="click:$root.accept">Gem</button>
</div>
</div>
</div>
</div>
在此示例中,单击:$ root.functionName将调用ViewModel中的函数。
答案 2 :(得分:0)
如果您应用以下模式,它会变得容易得多:
<form class="modal hide fade" data-bind="visible:selectedItem, with:selectedItem, submit:deselectItem">
...
</form>
这样,您可以在提交处理程序中获取表单,并可以在那里正确关闭它:
deselectItem = function(form){
...
$(form).modal('hide');
}
答案 3 :(得分:0)
我已经将这个自定义绑定处理程序用于引导模式。另外在模态中我添加了两个时刻datepicker。但是当我使用这个绑定处理程序时,模态在click事件上是可见的,但是datepicker div也是可见的
如果我不使用它并使用
$('.classname_of_bootstrap_modal').modal('show')
模态完美无缺。
所以,我想在使用这个绑定处理程序时遇到了一些问题而且无法获得它。
我评论了这个
$("input", element).focus();
这样做datepicker
div不会自动显示。当我点击它们时它们是可见的但是删除它的问题是如果我点击其中一个datepicker
,它会关闭引导模式。但它不应该关闭它。