使用knockout自动显示twitter bootstrap模态对话框

Gor*_*vic 18 twitter-bootstrap knockout.js

当我从列表中选择一个项目时,我需要显示用于在单页面应用程序中编辑项目的模态对话框.

问题:我使用了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">&times;</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>
Run Code Online (Sandbox Code Playgroud)

这个模型是带有observableList,obervable selectedItem和deselectItem函数的简单对象,它将selectedItem设置为null.

Gor*_*vic 42

正如我所知,(可能)最好的方法是创建一个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');
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

用法是这样的:

<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">&times;</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>
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要相反的反馈,您可以订阅绑定的"init"部分中的任何事件,并在结束时删除所选项目(不确定您是否希望在取消和提交时执行相同的操作) (3认同)

Her*_*ker 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">&times;</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>
Run Code Online (Sandbox Code Playgroud)

在此示例中,单击:$ root.functionName将调用ViewModel中的函数.