0

サーバーから、次のようなオブジェクトを受け取ります。

var fromServer = { 
    foo: "Some foo", 
    barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] 
};

ノックアウト用のマッピングプラグインを使用して、ビューモデルの構築方法をカスタマイズし、配列を長さ2のサブ配列に分割したいと思います。

viewModel: {
    foo: "Some foo",
    barArray: [ ["bar1", "bar2"], ["bar3", "bar4"], ["bar5"] ]
}

そこに行く途中で、createコールバックが配列アイテムごとに1回呼び出されることに気付きました。これが私の見解です:

<h1 data-bind="text: foo"></h1>
<ul data-bind="foreach: barArray">
    <li data-bind="text: $data.name"></li>
</ul>

そしてjavascript:

var fromServer = { foo: "Some foo", barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] };

var mapping = {
    'barArray': { 
        create: function(options) {
            return new barModel("This is " + options.data);
        }
    }
};

var barModel = function(data) {
   this.name = data; 
};

var viewModel = ko.mapping.fromJS(fromServer, mapping);

ko.applyBindings(viewModel);

これが動作を示すフィドルです

本当の質問は次のとおりです。createコールバックを使用して、各要素ではなく、配列全体に一度に1つずつアクセスできますか?または、私はこれに間違った方法でアプローチしていますか?

4

3 に答える 3

1

JSONのルートからオブジェクトをマッピングするには、これを行う必要があります

        var mapping = {
            '': { 
                create: function(options) {
                    return new .....
                }
            }
        };
于 2013-02-22T16:03:21.003 に答える
0

ドキュメントを見ると、createメソッドに渡されるoptionsパラメーターには2つのプロパティがあります。

data:この子のデータを含むJavaScriptオブジェクト

parent:この子が属する親オブジェクトまたは配列

したがって、を使用してアクセスできますoptions.parent

于 2013-02-22T15:15:05.607 に答える
0

ビューモデルを作成する前に、入力配列を使用する方法で再構築できます。何らかの方法で「セマティックにグループ化された」データの配列を使用するのではなく、それに応じてプロパティが入力されたオブジェクトの配列に変換できます。

あなたのデータはどういうわけか平日に関連していると思いますので、各平日のデータを保持するWeekViewModelを作成しました。データをviewmodelにマッピングする前に、ProcessBeforeCreatingViewModel関数を使用して処理します。

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

function ProcessBeforeCreatingViewModel(data) {

 var tempObj = null;

 var data_processed = {
    foo: data ? data.foo : '',
    barArray: []
 };

 if (data && data.barArray) {

    data.barArray.forEach(function (barItem, index) {

        if (index % days.length == 0) {
            tempObj = {};
            days.forEach(function (dayName) {
                tempObj[dayName] = undefined;
            });
            data_processed.barArray.push(tempObj);
        }

        tempObj[days[index]] = barItem;
    });
 }

 return data_processed;
}


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

var fromServer_Processed = ProcessBeforeCreatingViewModel(fromServer);

var viewModel = ko.mapping.fromJS(fromServer_Processed, mapping);

ko.applyBindings(viewModel);

ここにフィドルがあります:http://jsfiddle.net/JeJKP/

于 2013-02-22T19:09:24.040 に答える