5

ノックアウト/ブリーズでプロジェクトを開発しています。

ノックアウトを強制的にオブザーバブルを変更済みとしてマークすることが可能かどうかを知りたいです (フォーカスがまだフィールドにある場合でも)。私の目的は、ユーザーが日付を変更し始めるたびに、それを保存できることをユーザーに通知することです (ボタンがすぐに表示されます)。たとえば、日付を含む入力フィールドがあります。ユーザーはこのフィールドで日付の編集を開始します。オブザーバブルは、ユーザーがフィールドのフォーカスを離れたときにのみ、新しくエンコードされた日付を解釈する必要があります。Save buttonしかし、彼が入力フィールドに何かを入力し始めたらすぐに表示したいと思います。私がはっきりしていることを願っています。

入力の日付を編集するための bindingHandlers は次のとおりです。

ko.bindingHandlers.dateRW = {
    //dateRW --> the 'read-write' version used both for displaying & updating dates
    init: function (element, valueAccessor, allBindingsAccessor) {
        var observable = valueAccessor();
        var value = ko.utils.unwrapObservable(valueAccessor);
        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {                
            var myDate = moment($(element).val(), "DD/MM/YYYY");
            observable(myDate.toDate());
        });
        //ko.utils.registerEventHandler(element, "keyup", function () {
        //    As soon as user begin to type something, I would like to show my save button
        //});
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var date = (typeof value !== 'undefined') ? moment(value) : null;
        var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : '';
        $(element).val(dateFormatted);
    }
};

そして私の見解:

<input type="text" data-bind="dateRW: myDate" />

valueUpdate: 'afterkeydown'カスタム bindingHandlers を使用しているため、残念ながら機能しません。

誰かが私を正しい方向に向けてくれることを願っています。

ありがとう。

4

2 に答える 2

9

試すobservable.valueHasMutated()

EDIT 他のコメントでは、有効な保存を「context.hasChanges()」(Breeze EntityManager から更新されますか?) にバインドしていると述べました。

Breeze はhasChanges、Knockout の監視可能な通知にサブスクライブしても更新されないと思います。私はそれが実際に観察可能な設定関数をラップし、値が実際に変化していることを確認すると思います。言い換えれば、実際には observables の値を変更して (そして元に戻して) trigger にする必要があると思いますhasChanges()

別の (あまり良くない) オプションは、オブザーバブルの親オブジェクトに戻って、それを取得することEntityAspectです。その後、` setModified() ' を呼び出すことができます。バインディング ハンドラーでこれをすべて行うのは、悪い考えのように思えます。バインドしているオブザーバブルが Breeze エンティティのプロパティであると実際に想定し始めるからです。

マイケルの答えに似たオプションを検討するのが最善かもしれません(しゃれは意図されていません)。おそらく、ビューモデルでsaveEnabled()オブザーバブルを次のように作成します。

var saveEnabled = ko.observable(false);
context.hasChanges.subscribe(function() { saveEnabled(true); });

keyup次に、Michael が提案するバインディングを使用するか、subscribe観測可能な日付の上に別のバインディングを追加して、バインディング ハンドラの呼び出しに戻るvalueHasMutated()ことができます (見つかった場合)。

于 2013-04-28T10:07:17.370 に答える
0

保存ボタンがすでにenableオブザーバブルに関連付けられていると仮定して、それsaveEnabledを と呼びましょう。イベント ハンドラーを使用してトリガーできるはずです。Knockout には、eventこのためだけのバインディングが含まれています。

<input type="text" data-bind="dateRW: myDate, event: {keyup: function() {saveEnabled(true);}}">

于 2013-04-28T10:40:32.697 に答える