OK、PW Kad からの提案に従って、質問 ID 17973991 の開始点から質問のこの部分を分割します。
私はそよ風を中心に構築されたデータコンテキストを利用するビューモデルを持っており、必要なデータをフェッチし、監視可能な配列にデータを入力します。Breeze によって既に取得されたデータを使用して、ツリービューで使用する別の (観察可能な) 配列を設定する必要があります。
既存のデータには正しいフィールド名がないため、dynatree/fancytree プラグインが使用できる正しいフィールド名を持つ新しい配列を作成できる必要があります。
私の最初の試み:(その後、機能しないことが示されたため、これを行わないでください!)
したがって、私のビューモデルでは、.js ファイルの先頭に次を追加しました。
var treeMaterials = ko.observableArray();
var treeMaterial = function (data) {
var self = this;
self.name = ko.observable(data.name);
self.id = ko.observable(data.id);
self.children = ko.observableArray();
$.each(data.children, function (index, item) {
self.children.push(new Person(item));
});
};
次に、モジュールに「asTreeMaterials」メソッドを追加しました。
var asTreeMaterials = function (treeMatsObservable, matsObservable) {
treeMatsObservable([]); //clear out array as we're rebuilding it in here
var tmpArray = treeMatsObservable(); //create local temp array to avoid ko notifications on each push
$.each(matsObservable, function (index, mat) {
tmpArray.push(new treeMaterial({
id: mat.id,
name: mat.materialName,
children: []
}));
});
treeMatsObservable(tmpArray);
};
(John Papa のコーディングから大いに借りています、John に感謝します!) 注: 基本が機能するようになると、「子」ビットにさらにコードが入ります。
最後に、「アクティブ化」メソッドを新しいメソッドを使用するように変更します。
var activate = function () {
// go get local data, if we have it
return datacontext.getMaterialPartials(materials),
asTreeMaterials(treeMaterials, materials);
};
....
次に、モジュールから新しい配列を返します。
var vm = {
activate: activate,
materials: materials,
treeMaterials: treeMaterials,
title: 'My test app page 1',
refresh: refresh
};
ツリービュー バージョンのデータについて、サーバーに再度アクセスしないことを意味します。
編集2.他の質問に関するPW Kadのガイダンスに従って(この質問にまもなく追加されます)、「asTreeMaterials」メソッドを次のように変更しました。
var asTreeMaterials = function () {
treeMaterials([]); //clear out array as we're rebuilding it in here
var matArray = materials().slice();
var tmpArray = [];
$.each(matArray, function (index, mat) {
tmpArray.push(new treeMaterial({
id: mat.id,
name: mat.materialName,
children: []
}));
});
treeMaterials(tmpArray);
};
私が別の新しい配列を作成しなければならない理由は(私が思うに)、私がスライスした既存の「材料」オブザーバブルに正しいプロパティが含まれていないためです。Dynatree/fancytree には (とりわけ) 「ID」と「名前」が必要です。私はIDを持っていますが、観測可能な材料に「materialName」があるため、観測可能な材料のスライスによって作成された配列の「$.each」は、「materialname」プロパティを新しい配列の「name」プロパティにプッシュします(tmpArray)。私はこれらすべてに慣れていないので、ここでマークから何マイルも離れているかもしれません!
実際に観測可能な配列が必要ですか...? 観測可能な配列が何のためにあるのかを理解していれば、私はそうしないと思います...私の資料はほとんど石に設定されており、非常にめったに変更されません。「treeMaterials」を標準のjavascribtオブジェクト配列としてそのままにして、それをobservableArrayにする代わりにビューモデルに返すことができると思いますか?
いずれにせよ、現在、materialname と ID の値は、作成中の tmpArray の関連するプロパティに渡されません。代わりに、観測可能なマテリアルから関数を取得しているので、実際の値を取得するには、何らかの「アンラップ」でこれにアプローチする必要があると思いますか?