マッピングは魔法ではありません。ほとんどの場合、この単純な再帰関数で十分です。
function MyMapJS(a_what, a_path)
{
a_path = a_path || [];
if (a_what != null && a_what.constructor == Object)
{
var result = {};
for (var key in a_what)
result[key] = MyMapJS(a_what[key], a_path.concat(key));
return result;
}
if (a_what != null && a_what.constructor == Array)
{
var result = ko.observableArray();
for (var index in a_what)
result.push(MyMapJS(a_what[index], a_path.concat(index)));
return result;
}
// Write your condition here:
switch (a_path[a_path.length-1])
{
case 'mapThisProperty':
case 'andAlsoThisOne':
result = ko.observable(a_what);
break;
default:
result = a_what;
break;
}
return result;
}
上記のコードは、オブジェクト階層の任意のレベルでmapThisPropertyおよびandAlsoThisOneプロパティからオブザーバブルを作成します。他のプロパティは一定のままです。値が存在するレベル (深さ) にa_path.lengthを使用するか、 a_pathのより多くの要素を使用して、より複雑な条件を表現できます。例えば:
if (a_path.length >= 2
&& a_path[a_path.length-1] == 'mapThisProperty'
&& a_path[a_path.length-2] == 'insideThisProperty')
result = ko.observable(a_what);
条件でtypeOf a_whatを使用して、たとえばすべての文字列を監視可能にすることができます。一部のプロパティを無視して、特定のレベルで新しいプロパティを挿入できます。または、a_pathを省略することもできます。等。
利点は次のとおりです。
- カスタマイズ可能 ( knockout.mappingよりも簡単)。
- 必要に応じて、コピーして貼り付け、さまざまなオブジェクトの個々のマッピングを書き込むのに十分な短さ。
- 小さいコードのknockout.mapping-latest.jsはページに含まれません。
- 絶対に必要なことだけを行うので、より高速になるはずです。