【问题标题】:Show twitter bootstrap modal dialog automatically with knockout使用淘汰赛自动显示 twitter 引导模式对话框
【发布时间】:2013-01-18 23:42:48
【问题描述】:

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

问题:我使用了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>

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

【问题讨论】:

    标签: twitter-bootstrap knockout.js


    【解决方案1】:

    据我所知,(可能)最好的方法是创建一个 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">&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>
    

    【讨论】:

    • 确实绑定处理程序是要走的路。只需将if (value()) 更改为if (ko.utils.unwrapObservable(value))。这样做将使您能够将绑定与 showModal: trueshowModal: !selectedItem() 或任何其他 javascript 表达式一起使用。
    • 我很好奇这个解决方案是否提供了相反的反馈 - 如果模式关闭,'selectedItem' 会反映关闭吗?
    • 如果您想要相反的反馈,您可以订阅绑定的“init”部分中的任何事件并在关闭时删除所选项目(但不确定您是否希望在取消和提交时执行相同的操作)跨度>
    • 这很棒,对我来说就像一个魅力。谢谢。
    • 这个答案确实是我想要的
    【解决方案2】:

    我喜欢 Goran 的简单方法。唯一的问题是,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>
    

    在本例中,click:$root.functionName 将调用 ViewModel 中的函数。

    【讨论】:

      【解决方案3】:

      如果你应用以下模式,它会变得容易得多:

      <form class="modal hide fade" data-bind="visible:selectedItem, with:selectedItem, submit:deselectItem">
          ...
      </form>
      

      这样,您可以将表单返回到您的提交处理程序中,并可以在那里正确关闭它:

      deselectItem = function(form){
        ...
        $(form).modal('hide');
      }
      

      【讨论】:

      • 谢谢,但我不喜欢在我的视图模型中使用 jQuery 选择器,这有点破坏了使用敲除的目的。我看到的主要好处是内部有干净的 js 视图模型和逻辑,与 html 结构完全分离。我将在我的视图模型中使用的唯一 jQuery 功能将是 $.ajax/post/get,但即使是别名也会更好,因此您可以在单点上具有依赖关系。
      • ($(form) 不是选择器,它是包装器。这样做,它不会与您包含的任何样式逻辑耦合。)我可以理解您的观点,不要过于依赖jQuery 在您的模型中,但由于它被称为 viewModel,我认为它有权在这里,特别是因为您的布局与引导程序紧密耦合。此外,我认为jQuery比knockout更广泛接受,所以我宁愿不要太依赖knockout而不是尽量不依赖jQuery。
      • 是的,但是这家伙解释得比我要好得多stackoverflow.com/a/15012542/408643 :)
      【解决方案4】:

      我已将此自定义绑定处理程序用于引导模式。同样在模态中,我添加了两个时刻日期选择器。但是当我使用这个绑定处理程序时,模式在点击事件上可见,但 datepicker div 也可见

      如果我不使用这个并使用

      $('.classname_of_bootstrap_modal').modal('show')
      

      模式工作得很好。

      所以,我想在使用此绑定处理程序时存在一些问题并且无法获取它。

      我评论了这个

      $("input", element).focus();
      

      这样做datepicker div 不会自动显示。当我单击它们时它们是可见的,但删除它的问题是如果我单击datepicker 之一,它会关闭引导模式。但它不应该关闭它。

      【讨论】:

        猜你喜欢
        • 2014-03-31
        • 2017-04-17
        • 2014-07-13
        • 2016-11-15
        • 2016-02-27
        • 2014-12-06
        • 2012-09-16
        • 2015-01-30
        • 2018-07-25
        相关资源
        最近更新 更多