1

何らかの理由で、関連する値が変更されたときに計算する ko.computed observable を取得できないようです。

これは、顧客の単一の報酬ポイント レコードを表すオブジェクトです。

//
// RewardPoints Model
var RewardPointsItemModel = function (data) {
    return {
        DateAwarded: ko.observable((data != null) ? data.DateAwarded : ""),
        Points: ko.observable((data != null) ? data.Points : 0)
    }
};

「OrderDetailModel」への参照を格納する単一の viewModel を定義します。この OrderDetailModel には、ko.observable として定義された単一のプロパティがあり、新しい空の OrderDetailModel のインスタンスで初期化されます。空の配列で初期化され、" $ OrderDetailForm " 参照によって識別される HTML の適切なセクションに適用されます。

$j(function () {
    //
    // initialize global DOM references
    $LoyaltyProgram = $j("#LoyaltyProgram");
    $LoyaltyHistory = $j("#LoyaltyHistory");
    $OrderDetailForm = $j("#OrderDetailForm");
    //
    // define and bind the viewModels
    viewModel = {
        OrderDetailModel: {
            OrderDetail: ko.observable( new OrderDetailModel([]) )
        }
    };
    ko.applyBindings(viewModel.LoyaltyHistoryOrderDetailModel, $OrderDetailForm[0]);

});

「 OrderDetailModel」オブジェクトの定義は次のとおりです。RewardPointsItemModelオブジェクト インスタンス (上記で定義)の配列を初期化パラメーター「データ」として受け取ります。最終的にこれが行うことは、RewardPointsItemModelsの配列を維持し、各RewardPointsItemModelsの Points プロパティの合計を計算することです。ページが最初にロードされると、空の配列 (上記を参照) を使用して this のインスタンスが作成され、計算された " TotalPoints " は 0 (ゼロ) になります。

//
// OrderDetail Model
function OrderDetailModel(data) {
    var self    = this;
    this.RewardPoints = ko.observableArray(data);
    this.TotalPoints = ko.computed(function () {
        var points = 0;

        if (self.RewardPoints.length <= 0)
            return points;

        for (var i = 0; i < self.RewardPoints().length; i++) {
            var record = self.RewardPoints()[i];
            points += record.Points();
        }
        return points;
    });
};

ユーザー インタラクションは、報酬ポイント レコードのリストを返す WebAPI サービスへの呼び出しを実行し、そのデータを以下のコールバック関数に「データ」引数として渡します。コールバック関数では、新しい空の配列を作成し、WebAPI 呼び出しから取得したレコードから作成されたRewardPointsItemModelオブジェクトのインスタンスを設定します。次に、ko.observable プロパティに格納されている OrderDetailModelの既存のインスタンスの ko.observableArray プロパティ「RewardPoints」の配列値を置き換えます... viewModel.OrderDetailModel.OrderDetail ...新しいrewardPoints 配列で。

function Callback(data) {

    var rewardPoints = new Array();
    for (var i = 0; i < data.ServiceModel.length; i++) {
        var model = new RewardPointsItemModel(data.ServiceModel[i]);
        rewardPoints.push(model);
    }
    viewModel.OrderDetailModel.OrderDetail().RewardPoints(rewardPoints);
};

この時点で、ko.computed オブザーバブル プロパティ " viewModel.OrderDetailModel.OrderDetail().TotalPoints() " が再計算されることを期待していますが、計算された関数に追跡コードを配置しても呼び出されません。関数は値を更新するために実行されていません。依存関係プロパティ (この場合は RewardPoints) が (空の配列から入力された配列に) 更新された場合、計算されたプロパティを再評価する必要があることを理解しています。

これは私が説明するのが複雑であることを知っているので、私が明確にしていることを願っています. これを明確に理解し、初期化後に計算された値が計算されない理由を見つけることができる、私よりもノックアウトに堪能な人がいることを願っています。

4

1 に答える 1

3

あなたの問題はここにあるようです:

if (self.RewardPoints.length <= 0)
        return points;

あなたがする必要があります:

if (self.RewardPoints().length <= 0)
        return points;

self.RewardPoints関数であるobservableArrayです。関数の長さは、関数に定義された引数の数です。AnobservableArrayは引数から読み取るため、名前付き引数をリストしないため、値は 0 です。

observableArrayしたがって、現在のコードは常に 0 を返し、依存関係を作成するために の値に実際にアクセスすることはありません。

于 2012-04-05T22:22:36.893 に答える