解決方案如下:http://jsfiddle.net/lookitstony/24hups0e/6/ Crimson的評論讓我想到了一個解決方案。淘汰模板時淘汰淘汰對話
我遇到了KO和Jquery UI對話框的問題。對話框不會被加載它們的模板銷燬。
我以前存儲對話框的一個實例,並重復使用它,而不使用綁定處理程序。在閱讀了一些關於包含綁定處理程序的文章後,我認爲這可能是處理對話的最佳方式。我是否使用敲除錯誤?我應該堅持存儲的參考還是KO有更好的方法來處理?如果這是一個SPA,如果我在可能會或可能沒有這些對話框的頁面之間進行交換,我將如何處理這個問題?
你可以看到通過點擊這裏檢查出我的例子中這一行爲:http://jsfiddle.net/lookitstony/24hups0e/2/
JAVASCRIPT
(function() {
ko.bindingHandlers.dialog = {
init: function (element, valueAccessor, allBindingsAccessor) {
var options = ko.utils.unwrapObservable(valueAccessor()) || {};
setTimeout(function() {
options.close = function() {
allBindingsAccessor().dialogVisible(false);
};
$(element).dialog(options);
}, 0);
//handle disposal (not strictly necessary in this scenario)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).dialog("destroy");
});
},
update: function (element, valueAccessor, allBindingsAccessor) {
var shouldBeOpen = ko.utils.unwrapObservable(allBindingsAccessor().dialogVisible),
$el = $(element),
dialog = $el.data("uiDialog") || $el.data("dialog");
//don't call open/close before initilization
if (dialog) {
$el.dialog(shouldBeOpen ? "open" : "close");
}
}
}
})();
$(function() {
var vm = {
open: ko.observable(false),
content: ko.observable('Nothing to see here...'),
templateOne: ko.observable(true),
templateTwo: ko.observable(false),
templateOneHasDialog: ko.observable(true),
showOne: function(){
this.templateTwo(false);
this.templateOne(true);
},
showTwo: function(){
this.templateOne(false);
this.templateTwo(true);
},
diagOpt: {
autoOpen: false,
position: "center",
modal: true,
draggable: true,
width: 'auto'
},
openDialog: function() {
if(this.templateOneHasDialog()){
this.content('Dialog opened!');
this.open(open);
} else {
this.content('No Dialog Available');
}
}
}
ko.applyBindings(vm);
});
HTML
<div id='ContentContainer'>
Experience Multiple Dialogs
<ul>
<li>Click "Open Dialog"</li>
<li>Move the dialog out of the center and notice only 1 dialog</li>
<li>Close Dialog</li>
<li>Now click "One" and "Two" buttons back and forth a few times</li>
<li>Now click "Open Dialog"</li>
<li>Move the dialog and observe the multiple dialogs</li>
</ul>
<button data-bind="click:showOne">One</button>
<button data-bind="click:showTwo">Two</button>
<!-- ko if: templateOne -->
<div data-bind="template:{name:'template-one'}"></div>
<!-- /ko -->
<!-- ko if: templateTwo -->
<div data-bind="template:{name:'template-two'}"></div>
<!-- /ko -->
</div>
<script type="text/html" id="template-one">
<h3>Template #1</h3>
<p data-bind="text:content"></p>
<div><input type= "checkbox" data-bind="checked:templateOneHasDialog" /> Has Dialog </div>
<button data-bind="click:openDialog">Open Dialog</button>
<!-- ko if: templateOneHasDialog -->
<div style="display:none" data-bind="dialog:diagOpt, dialogVisible:open">
The Amazing Dialog!
</div>
<!-- /ko -->
</script>
<script type="text/html" id="template-two">
Template #2
</script>
組件綁定將簡化所有這些。 – CrimsonChris 2015-03-31 02:58:41
@CrimsonChris,我希望我可以說你的評論幫助。我已經查看了組件,但它們看起來像模板/視圖模型上的一個花哨層。你能詳細闡述一下這將如何幫助或提供一個例子來清楚地表明? – Tony 2015-03-31 14:47:53
組件綁定可以是動態的。您可以製作一堆對話框組件,然後將其名稱之一傳遞給負責顯示對話框組件的「對話層」。 – CrimsonChris 2015-03-31 14:51:35