Valueupdate一个计算的observable在keyup上,但不依赖于它可观察到的observable

时间:2013-09-25 13:34:51

标签: knockout.js

我有一个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上没有依赖的可观察变化?

1 个答案:

答案 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());
};