使用 jQuery-ui 对话框的 Knockout 组件忽略绑定
Knockout component using jQuery-ui dialog ignores bindings
我正在使用淘汰组件来模块化我的 UI。
其中之一实例是包含几个按钮的 jQuery-ui 对话框。
它们以及对话框中包含的任何内容的所有数据绑定都将被忽略。
是的,我已经阅读了此处关于混合敲除和 jQuery 的警告,但我有哪些替代方案?
好吧,在这个简单的案例中,我有一个解决方法。继续阅读。
我的组件被拆分成 test.html
<div id="trashcan-dlg">
<button data-bind="click: trashcanRecoverAll">Recover all</button>
</div>
和test.js
"use strict";
define(["jquery", "jquery-ui"], function($) {
function TrashcanWidgetViewModel(params) {
$("#trashcan-dlg")
.dialog({
resizable: false,
height: "auto",
width: "auto",
modal: false,
title: "Trashcan management"
});
}
TrashcanWidgetViewModel.prototype.trashcanRecoverAll = function() {
console.log("trashcanRecoverAll");
};
return TrashcanWidgetViewModel;
});
注册于:
ko.components.register("test", {
viewModel: {require: "widgets/test"},
template: {require: "text!widgets/test.html"}
});
如果我为对话框定义自定义绑定,问题不会改变。没有错误,什么都没有。如果 jQuery-ui 对话框重写 DOM,这是有道理的:结果 DOM 中没有 data-bind
指令。或者我遗漏了一些明显的东西?
在这种简单的情况下,解决方法是摆脱 click
绑定并使用非 ko 单击事件处理。只需将以下内容添加到构造函数中:
this.toolbarTrashcan = function() {
console.log("trashcanPurgeSelected");
};
$("button", "#trashcan-dlg").on("click", this.toolbarTrashcan);
感谢您的宝贵时间!
我认为您的问题是您在组件实例化完成之前进行了此调用 $("#trashcan-dlg").dialog(...)
。
如果您将那部分代码更改为:
,您的 click
绑定应该开始工作
setTimeout(function () {
$("#trashcan-dlg")
.dialog({
resizable: false,
height: "auto",
width: "auto",
modal: false,
title: "Trashcan management"
});
}, 0);
setTimeout(...) 会将 $("#trashcan-dlg").dialog(...) 调用放到 JS 事件循环的末尾,以便在 ko
基础设施有完成 DOM 操作。
我正在使用淘汰组件来模块化我的 UI。 其中之一实例是包含几个按钮的 jQuery-ui 对话框。 它们以及对话框中包含的任何内容的所有数据绑定都将被忽略。 是的,我已经阅读了此处关于混合敲除和 jQuery 的警告,但我有哪些替代方案? 好吧,在这个简单的案例中,我有一个解决方法。继续阅读。
我的组件被拆分成 test.html
<div id="trashcan-dlg">
<button data-bind="click: trashcanRecoverAll">Recover all</button>
</div>
和test.js
"use strict";
define(["jquery", "jquery-ui"], function($) {
function TrashcanWidgetViewModel(params) {
$("#trashcan-dlg")
.dialog({
resizable: false,
height: "auto",
width: "auto",
modal: false,
title: "Trashcan management"
});
}
TrashcanWidgetViewModel.prototype.trashcanRecoverAll = function() {
console.log("trashcanRecoverAll");
};
return TrashcanWidgetViewModel;
});
注册于:
ko.components.register("test", {
viewModel: {require: "widgets/test"},
template: {require: "text!widgets/test.html"}
});
如果我为对话框定义自定义绑定,问题不会改变。没有错误,什么都没有。如果 jQuery-ui 对话框重写 DOM,这是有道理的:结果 DOM 中没有 data-bind
指令。或者我遗漏了一些明显的东西?
在这种简单的情况下,解决方法是摆脱 click
绑定并使用非 ko 单击事件处理。只需将以下内容添加到构造函数中:
this.toolbarTrashcan = function() {
console.log("trashcanPurgeSelected");
};
$("button", "#trashcan-dlg").on("click", this.toolbarTrashcan);
感谢您的宝贵时间!
我认为您的问题是您在组件实例化完成之前进行了此调用 $("#trashcan-dlg").dialog(...)
。
如果您将那部分代码更改为:
click
绑定应该开始工作
setTimeout(function () {
$("#trashcan-dlg")
.dialog({
resizable: false,
height: "auto",
width: "auto",
modal: false,
title: "Trashcan management"
});
}, 0);
setTimeout(...) 会将 $("#trashcan-dlg").dialog(...) 调用放到 JS 事件循环的末尾,以便在 ko
基础设施有完成 DOM 操作。