0

テキスト入力に関連付けられている別のオブザーバブルの値に依存するcomputedObservableがあります。そのように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);
    ...
};

ComputerObservableはhasValidAlmUrl現在正しく動作しますが<input>、フォーカスが<input>変更されたときではなく、キーダウン イベントで更新する必要があります。valueUpdate: 'afterkeydown'に aを追加することで、これを機能させることができます<input>

私が気に入らないのは、これらの要素がモーダルになっていることです。モーダル オーバーレイの背後には、入力されたモーダル内のエンティティが含まれるエンティティのリストがあります。を に設定する<input>valueUpdate: 'afterkeydown'、入力の値が変化するにつれてモーダルの背後にあるグリッドが変化するのがわかります。これは見栄えが悪いと思います。

依存しているオブザーバブルのキーダウンで計算されたオブザーバブルの更新を行う方法はありますが、キーダウンで依存するオブザーバブルの変更はありませんか?

4

1 に答える 1

1

一時的な入力を保持するために NEW オブザーバブルを作成し、いくつかのイベント (フォーカス、適用など) でその値を元のオブザーバブルにコピーします。

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 に答える