【问题标题】:knockout modal window opens only once淘汰模式窗口仅打开一次
【发布时间】:2014-07-16 16:57:44
【问题描述】:

我有在按钮点击时打开的引导模式窗口。一切正常,除了一件事:当我单击非模态空间时 - 模态窗口关闭,但我可以在单击按钮时再次打开它。如果我在按钮关闭时关闭模式 - 它运作良好。

更新:当我使用“Esc”键盘关闭模式时 - 行为与非模式单击相同。


HTML

<button data-bind="click: function () { $root.showLogModal(); }" title="Show Logs" class="btn btn-large btn-info">Show Logs</button>

<div data-bind="bootstrapLogModal: logModal" tabindex="-1" role="dialog"></div>

自定义模板

<script id="showLogModal" type="text/html">
<div class="modal-header">
    <button type="button" class="close" data-bind="click: close" aria-hidden="true">&times;</button>
    <h3>Logs</h3>
</div>
<div class="modal-body">
    <div class="alert alert-info">
      Some Content
    </div>
</div>
<div class="modal-footer">
    <button type="button" class="btn" data-bind="click: close">Close</button>
</div>

JS

function ViewModel() {
    var self = this;

    self.logModal = {
        show: ko.observable(false),

        onClose: function () {
        },
        onAction: function () {
        }
    };

    self.showLogModal = function () {
        self.logModal.show(true);
    };
}

$(function () {
    var viewModel = new ViewModel();

    ko.bindingHandlers.bootstrapLogModal = {
        init: function (element, valueAccessor, allBindingsAccessor, data, bindingContext) {
            var props = valueAccessor(),
                vm = bindingContext.createChildContext(data);
            ko.utils.extend(vm, props);
            vm.close = function () {
                vm.show(false);
                vm.onClose();
            };
            vm.action = function () {
                vm.onAction();
            };
            ko.utils.toggleDomNodeCssClass(element, "modal hide fade large", true);
            ko.renderTemplate("showLogModal", vm, null, element);
            var showHide = ko.computed(function () {
                $(element).modal(vm.show() ? 'show' : 'hide');
            });
            return {
                controlsDescendantBindings: true
            };
        }
    };

    ko.applyBindings(viewModel);

});

http://jsfiddle.net/tLT6d/ 这里是 Live 示例。

【问题讨论】:

    标签: javascript html knockout.js bootstrap-modal


    【解决方案1】:

    这是预期的行为,如果您想防止在单击外部区域时关闭模式,请将backdrop 属性提供为'static'。

    Includes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click.
    

    更新

    我不知道您为什么将引导模式重写为淘汰赛,但是为了使您的代码在单击外部区域时无需关闭模式即可工作。 只需在绑定处理程序中添加这行代码

    ko.renderTemplate("showLogModal", vm, null, element);
    // adds new code
    $(element).modal({ backdrop: 'static', show: false });
    var showHide = ko.computed(function () {
       $(element).modal(vm.show() ? 'show' : 'hide');
    });
    

    更新 2

    要修复您的初始代码以执行正确关闭,当单击外部区域时,附加隐藏事件处理程序并调用相关的关闭方法。

    // adds new code
    $(element).on("hidden.bs.modal", function(){
       vm.close();
    });
    var showHide = ko.computed(function () {
       $(element).modal(vm.show() ? 'show' : 'hide');
    });
    

    【讨论】:

    • 感谢您的回复。是的,我读过它,但是允许用户通过单击模式区域之外的方式关闭模式并再次打开它呢?
    • 再次感谢。但我想在外部点击时关闭它。并再次打开它。这是我的问题。关于I don't know why you rewrite the bootstrap modal into knockout - 我刚开始使用淘汰赛和引导程序,所以我在项目中使用现有代码。但你可以建议更好的解决方案:)
    • @user3770925,看我的更新,在我看来你不必创建一个引导包装处理程序来显示和隐藏模式,你可以在bootstrap documentation中使用普通的Static example跨度>
    • 第二次更新帮助)谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多