これは特定の質問とは少し異なりますが、ブートストラップモーダルを操作する別の方法を次に示します。
modal
ブートストラップとバインディングの両方をラップするカスタム バインディングを使用できますtemplate
。
バインディングは次のようになります。
ko.bindingHandlers.modal = {
init: function(element, valueAccessor, allBindings, vm, context) {
var modal = valueAccessor();
//init the modal and make sure that we clear the observable no matter how the modal is closed
$(element).modal({ show: false, backdrop: 'static' }).on("hidden.bs.modal", function() {
if (ko.isWriteableObservable(modal)) {
modal(null);
}
});
//template's name field can accept a function to return the name dynamically
var templateName = function() {
var value = modal();
return value && value.name;
};
//a computed to wrap the current modal data
var templateData = ko.computed(function() {
var value = modal();
return value && value.data;
});
//apply the template binding to this element
ko.applyBindingsToNode(element, { template: { 'if': modal, name: templateName, data: templateData } }, context);
//tell KO that we will handle binding the children (via the template binding)
return { controlsDescendantBindings: true };
},
update: function(element, valueAccessor) {
var data = ko.utils.unwrapObservable(valueAccessor());
//show or hide the modal depending on whether the associated data is populated
$(element).modal(data ? "show" : "hide");
}
};
ここで、次のようにページに単一のモーダルをバインドします。
<div class="modal hide fade" data-bind="modal: currentModal"></div>
currentModal
(テンプレートname
名) とdata
.
これが機能する方法はcurrentModal
、データが入力されている場合、現在のテンプレートとデータを使用してモーダルが表示されるというものです。null の場合currentModal
、モーダルは閉じられます。
これがどのように機能するかのサンプルを次に示します: http://jsfiddle.net/rniemeyer/NJtu7/