0

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 の関連するプロパティに渡されません。代わりに、観測可能なマテリアルから関数を取得しているので、実際の値を取得するには、何らかの「アンラップ」でこれにアプローチする必要があると思いますか?

4

1 に答える 1