我有一个复选框和一个文本框(两个都启用,复选框启动未选中[false])。 我需要的是以下内容:
到目前为止我尝试的是以下代码:
//The checked property in the checkbox is binded to
that.BuildingCriteria.IncludeLoadingDocks
that.BuildingCriteria.IncludeLoadingDocks.subscribe(function (newValue) {
if (!that.updatingTextBox && !newValue) {
that.BuildingCriteria.LoadingDocksMin(null);
}
});
//The textbox value is binded to that.BuildingCriteria.LoadingDocksMin
that.BuildingCriteria.LoadingDocksMin.subscribe(function (newValue) {
that.updatingTextBox = true;
that.BuildingCriteria.IncludeLoadingDocks(true);
that.updatingTextBox = false;
});
如果您尝试上述所有步骤,对于所有这些步骤都有效,但是当您尝试其中一些步骤再次停止为某些工作时...特别是如果您在文本框中写了一些未选中复选框的内容然后离开文本框,它不再自动检查复选框。 我尝试使用标志你可以看到,但我不能让它始终适用于所有情况。 我已经做了好几天了,所以如果你能尽快帮助我,我会非常感激! 在此先感谢!!
答案 0 :(得分:0)
几乎不可能直截了当地回答你的问题,但从中我觉得最接近的可能是注意一些你可能需要考虑的KO功能。
value
binding支持valueUpdate = 'afterkeydown'
版本,可让您实时保持文本框和复选框的同步。这可能会消除对要求3的需求。computed
observable支持专门化read
和write
操作,有时可能比使用subscription
更清晰。throttle
extender和hasfocus
binding可以帮助您。何时使用哪个功能有great blogpost。
在任何情况下,如果没有业务案例,您的要求有点难以理解,甚至可能是您遇到XY-problem。根据您的实现要求,我假设功能(不是实现)这样的要求:
这里是a jsfiddle,演示了如何处理这些功能需求。为了完整性,这里是相关代码,从视图开始:
<input type="checkbox" data-bind="checked: isChecked" />
<input type="textbox" data-bind="value: someText, valueUpdate: 'afterkeydown', selectSuggestion: someText" />
用于选择“默认建议文字”的自定义绑定:
var suggestion = "<enter something>";
ko.bindingHandlers.selectSuggestion = {
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var currentText = ko.utils.unwrapObservable(valueAccessor());
if (currentText === suggestion) element.select();
}
};
ViewModel:
var ViewModel = function() {
var self = this;
var privateIsChecked = ko.observable(false);
var privateText = ko.observable("");
self.isChecked = ko.computed({
read: privateIsChecked,
write: function(value) {
if (!privateIsChecked() && value && privateText() === "") {
privateText(suggestion);
}
if (privateIsChecked() && !value) {
privateText("");
}
privateIsChecked(value);
}
});
self.someText = ko.computed({
read: privateText,
write: function(value) {
privateIsChecked(value !== "");
privateText(value);
}
});
}
我知道这不会直接回答你的问题,但就像我说在Stack Overflow上为我们做的很难,而且不知道你的商业案例。