4

mvc4 のモデルから Knockout でビュー モデルを作成しています。マッピングプラグインを使用しています。現在のコードは次のようになります。

最初に、必要なさまざまな MVC4 モデルを 1 つの ko ビューモデルにマージします。

var mergedData = $.extend(true, {}, initialEventData,
    { "Tickets": initialTicketData }, { "TimeZones": timeZones }
);

2 番目:ビューモデルに計算関数を追加するためのマッピングを追加します。

var mapping = {
    'Tickets': {
        create: function (options) {
            return new updatedTicket(options.data);
        }
    }
}

var updatedTicket = function (data) {
    ko.mapping.fromJS(data, {}, this);

    this.formattedPrice = ko.computed(function () {
        return "$" + parseFloat(this.Price()).toFixed(2);
    }, this);
}

最後に:バインディングを適用します。

var eventViewModel = ko.mapping.fromJS(mergedData, mapping);

ただし: Tickets モデルが空に戻る場合があります。これが発生すると、マッピング プラグインは監視可能な配列を作成しません (当然のことです)。新しいチケットをプッシュできるように、マッピングされたプロパティを含む空の配列を作成する必要があります。

4

2 に答える 2

0

デフォルトのチケット配列を作成できるコンテナビューモデルを作成するだけです...コールバック関数でも、「this」を参照する変数を必ず使用してください

   var mapping = {
    'Tickets': {
        create: function (options) {
            return new updatedTicket(options.data);
        }
    }
}

var updatedTicket = function (data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    this.formattedPrice = ko.computed(function () {
        return "$" + parseFloat(self.Price()).toFixed(2);
    }, this);
}

var viewModel = function ( )  {
    this.Tickets = ko.observableArray([]);
    ko.mapping.fromJS(mergedData, mapping, this);
}

var eventViewModel = new viewModel();
于 2012-06-14T22:25:01.170 に答える
0

マッピング構成にチェックを追加するだけです。updatedTicket 関数にデータがあるかどうかを確認し、そうでない場合は手動で監視可能な配列を作成します

于 2012-06-14T17:47:42.967 に答える