4

私はノックアウトに慣れていないので、これを正しく行っているかどうかわかりません

より高度な製品セレクターが欲しいという事実を除いて、ノックアウトライブの例と同じように、ショッピングカートエディターがあります。私の製品には実際には2種類のコードがあり、ユーザーはそのうちの1つを入力して、カートで製品の完全な詳細を取得できる必要があります。したがって、コードの種類ごとに 2 つの入力があり、ユーザーがそれらのいずれかにコードを入力すると、ajax 呼び出しを行い、製品情報 (productId、productName、the_other_code などを含む) をロードする必要があります。

私はコード1とコード2の両方にサブスクライブすることでこれを試みました-サーバーからデータを取得した後、ajax呼び出しを行い、モデルのデータを設定しますが、一種の再帰イベント(サブスクライブ)が発生し、ajaxメソッドを繰り返し呼び出します.したがって、私は信じていますメソッド中にノックアウトサブスクリプションをオフに設定できる場合SetData、再帰的な行為は発生しません。

function Product(data) 
{
    var self = this;

    self.ProductId = ko.observable();
    self.Code1 = ko.observable();
    self.Code2 = ko.observable();
    self.Title = ko.observable();

    self.SetData = function (itemdata) {
        self.ProductId (itemdata ? itemdata.ProductId : null);
        self.Code1(itemdata ? itemdata.Code1 : null);
        self.Code2(itemdata ? itemdata.Code2 : null);
        self.Title(itemdata ? itemdata.Title : null);
    };

    self.SetData(data);

    self.Code1.subscribe(function (value) 
    {
        var productInfo = Ajax_GetPartDataWithCode1(value);
        self.SetData(productInfo );
    });

    self.Code2.subscribe(function (value) {
        var productInfo = Ajax_GetPartDataWithCode2(value);
        self.SetData(productInfo );
    });
}

どんな助けでも大いに役に立ちます!

4

1 に答える 1

2

単純なブール値フラグで十分です。開始時に true に設定しSetData、終了時に false に設定します。サブスクライブでは、フラグが設定されている場合はすぐにコールバックが返されます。

    var updatingData = false;

    self.SetData = function (itemdata) {
        updatingData = true;
        self.ProductId (itemdata ? itemdata.ProductId : null);
        self.Code1(itemdata ? itemdata.Code1 : null);
        self.Code2(itemdata ? itemdata.Code2 : null);
        self.Title(itemdata ? itemdata.Title : null);
        updatingData = false;
    };

    self.SetData(data);

    self.Code1.subscribe(function (value) 
    {
        if (updatingData) return;
        var productInfo = Ajax_GetPartDataWithCode1(value);
        self.SetData(productInfo);
    });

    self.Code2.subscribe(function (value) {
        if (updatingData) return;
        var productInfo = Ajax_GetPartDataWithCode2(value);
        self.SetData(productInfo);
    });
于 2012-08-01T02:25:35.983 に答える