0

我有一个 computedObservable,它取决于另一个与文本输入相关的 observable 的值。像这样,hasValidAlmUrlcomputedObservable 在哪里:

<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);
    ...
};

computedObservable目前hasValidAlmUrl可以正常工作,但我希望它在 keydown 事件上更新,<input>而不是在焦点<input>更改时更新。我可以通过valueUpdate: 'afterkeydown'<input>.

我不喜欢的是这些元素是模态的。模态叠加层后面是一个实体列表,填充模态中的实体是其中的一部分。当我将 设置为<input>valueUpdate: 'afterkeydown',您可以看到模式后面的网格随着输入值的变化而变化,我认为这看起来很糟糕。

有没有办法对它所依赖的可观察对象的 keydown 进行计算的可观察更新,但在 keydown 上没有相关的可观察更改?

4

1 回答 1

1

创建一个新的可观察对象来保存您的临时输入,并在某些事件(焦点、应用等)上将该值复制到您的原始可观察对象中:

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());
};
于 2013-09-25T16:43:54.343 回答