我有一个computedObservable,它取决于与文本输入相关的另一个observable的值。像这样,hasValidAlmUrl
是computedObservable:
<input type="text" data-bind="value: selectedArchive().almUrl" />
<button type="button" data-bind="enable: hasValidAlmUrl">Test</button>
我的淘汰视图模型如下所示:
function ArchiveViewModel() {
var self = this;
self.selectedArchive = ko.observable(new ArchiveData());
self.hasValidAlmUrl = ko.computed(function () {
var almUrl = self.selectedArchive().almUrl();
if (typeof (almUrl) == 'undefined') return false;
return almUrl.length > 0;
}, self);
...
};
hasValidAlmUrl
computedObservable当前正常工作,但我希望它更新<input>
的keydown事件,而不是<input>
的焦点更改时。我可以通过在valueUpdate: 'afterkeydown'
上添加<input>
来实现此目的。
我不喜欢的是这些元素是模态的。模态叠加层后面是填充模态中的实体所属的实体列表。当我将<input>
设置为valueUpdate: 'afterkeydown'
时,您可以看到模态后面的网格随着输入值的变化而变化,我觉得这看起来很糟糕。
有没有办法在可观察的keydown上有一个计算的可观察更新它依赖于但是在keydown上没有依赖的可观察变化?
答案 0 :(得分:1)
创建一个新的observable以保存您的临时输入,并在某些事件(焦点,应用等)上将该值复制到您的原始可观察量中:
self.tmpAlmUrl = ko.observable(); // bind your input to this
self.hasValidAlmUrl = ko.computed(function () {
return (typeof (self.tmpAlmUrl()) !== 'undefined') && self.tmpAlmUrl().length;
});
// call when about to show the modal
self.onDisplayModal = function () {
self.tmpAlmUrl(self.selectedArchive().almUrl();
});
// call when you want to "apply" the new url
self.onApplyChanges = function () {
self.selectedArchive.almUrl(self.tmpAlmUrl());
};