1

ここでフィドル

ビューモデルのコレクションに直接マップしたいオブジェクトの配列がありますが、マッピングをカスタマイズしたいと思います。ただし、data.UserReportsコレクションにアイテムが1つしかない場合を除いて、コードは機能しません。

オブジェクトグラフに別のレイヤーを追加すると、たとえばdata.UserReportsをmodel.UserReportsにマッピングする代わりに、Fooという名前のモデルにプロパティがある場合は、データをfooにマッピングして、コレクションにアクセスできます。 model.Foo.UserReportsを介して、しかしこれは望ましくなく、厄介です。

また、data.UserReports配列を反復処理し、各UserReportをモデルのコレクションに順番にプッシュすればできると思いますが、これも不器用なようです。

では、フィドルの何が問題になっていますか?

4

2 に答える 2

1

そのフィドルのコードは、少なくとも私にとってはまったく機能していません。ただし、既存のビュー モデル インスタンスでマッピング プラグインを通常使用する方法は次のとおりです。

function PageModel() { /* ... */ }

$(document).ready(function() {
    var model = new PageModel();

    // Don't replace some observable, but extend the view model automatically,
    // creating an observable for each property in "data".
    ko.mapping.fromJS(data, userReportMapping, model);

    ko.applyBindings(model);
}​);​

http://jsfiddle.net/Quu4f/27/


更新:また、マッピング オプションを適用するデータ オブジェクトのキーを指定する必要があります。

var userReportMapping = {
   'UserReports': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.Id);
        },
        create: function(options) {
            return new userReportModel(options.data);
        }
    }
};

ただし、データ セットに同じ ID を持つ 2 つのアイテムがある場合にエラーが発生するのは少し奇妙です。複製に対して「作成」コールバックが実行されていないように見えますが、通常のオブザーバブルはまだ作成されています。

http://jsfiddle.net/Quu4f/29/

于 2012-07-07T21:41:20.863 に答える
0

これは、配列を反復処理し、各アイテムを順番に監視可能なコレクションにプッシュすることによってそれを実行しています-より良い方法はありますか?

于 2012-07-07T21:30:03.440 に答える