1

したがって、ノックアウトを使用して最初の 1 週間で、良いプロトタイプを作成できたと思います: (トリミングして ajaxy 呼び出しを削除)

http://jsfiddle.net/NelsonLampreht/39dfx/

"use strict";

var steeringTeamSheetViewModel = function (serviceUrl) {
var self = this;
self.viewModel = ko.mapping.fromJS([]);

self.InitializeAjax = function () {
    //abbreviated  
};

self.GetData = function () {
    //abbreviated
    var data = {
        "Sections": [{
            "ProjectType": "BUSINESS EXPANSION",
                "Projects": [{
                "ID": "767a46a2-ddba-435c-a9f9-fdb9f0175337",
                    "ItemOrder": 0,
                    "ProjectName": "project abc"
            }, {
                "ID": "0e36d7da-92e6-4f1b-939d-936d6e759115",
                    "ItemOrder": 0,
                    "ProjectName": "project abc"
            }, {
                "ID": "f6e447d4-955d-48e0-bcdf-6db9044b7a89",
                    "ItemOrder": 0,
                    "ProjectName": "project a"
            }]
        }, {
            "ProjectType": "OPER & MAINT - EFFICIENCY",
                "Projects": [{
                "ID": "9883a3c8-d01e-4fc9-8f66-9b46d720afde",
                    "ItemOrder": 0,
                    "ProjectName": "project q"
            }]
        }, {
            "ProjectType": "OTHER",
                "Projects": [{
                "ID": "f1ccfa79-c5b1-4880-b5a1-1c2350e709e1",
                    "ItemOrder": 0,
                    "ProjectName": "project 1"
            }]
        }]
    };
    self.ProcessRetrievedData(data);
};

self.ProcessRetrievedData = function (retrievedData) {
    self.viewModel(retrievedData);
};   

self.GetData();
};
var steeringTeamSheetService = 'someurl';
var sts = new steeringTeamSheetViewModel(steeringTeamSheetService);
ko.applyBindings(sts);

私が今やろうとしているのは、ko.oberservableArray を別のバインディングに変更することです。.indexed() のように、あちこちに浮かんでいます。

http://jsfiddle.net/NelsonLampreht/39dfx/19/

"use strict";

var steeringTeamSheetViewModel = function (serviceUrl) {
var self = this;
var mapping = {
'sections': {
    create: function(options) {
        alert(options);
    }
}
}
self.viewModel = ko.mapping.fromJS([],mapping);

self.InitializeAjax = function () {
    //abbreviated  
};

self.GetData = function () {
    //abbreviated
    var data = {
        "Sections": [{
            "ProjectType": "BUSINESS EXPANSION",
                "Projects": [{
                "ID": "767a46a2-ddba-435c-a9f9-fdb9f0175337",
                    "ItemOrder": 0,
                    "ProjectName": "project abc"
            }, {
                "ID": "0e36d7da-92e6-4f1b-939d-936d6e759115",
                    "ItemOrder": 0,
                    "ProjectName": "project abc"
            }, {
                "ID": "f6e447d4-955d-48e0-bcdf-6db9044b7a89",
                    "ItemOrder": 0,
                    "ProjectName": "project a"
            }]
        }, {
            "ProjectType": "OPER & MAINT - EFFICIENCY",
                "Projects": [{
                "ID": "9883a3c8-d01e-4fc9-8f66-9b46d720afde",
                    "ItemOrder": 0,
                    "ProjectName": "project q"
            }]
        }, {
            "ProjectType": "OTHER",
                "Projects": [{
                "ID": "f1ccfa79-c5b1-4880-b5a1-1c2350e709e1",
                    "ItemOrder": 0,
                    "ProjectName": "project 1"
            }]
        }]
    };
    self.ProcessRetrievedData(data);
};

self.ProcessRetrievedData = function (retrievedData) {
    self.viewModel(retrievedData);
    //I think I should be using something like
    //self.viewModel = ko.mapping.fromJSON(retrievedData,mapping,{});
};   

self.GetData();
};
var steeringTeamSheetService = 'someurl';
var sts = new steeringTeamSheetViewModel(steeringTeamSheetService);
ko.applyBindings(sts);

ただし、それがなければ、モデルをセットアップして Web サービス (c#) からデータを取得する際に正しいパターンに従っているとは思えません。

誰かが私がこれを正しく行っていることを検証し、パターンの作成を支援できますか?

4

1 に答える 1

0

あなたの問題を理解しているので、ajax 経由でデータをダウンロードして、steeringTeamSheetViewModel のプロパティ 'viewModel' に保存しようとしています。あなたのやり方は私には大丈夫に見えます。

self.viewModel を上書きしないでください。ko.applyBindings がその時点まで実行された場合、バインディングが壊れてしまうからです。

self.ProcessRetrievedData = function (retrievedData) {
    // map the data from the viewModel and update self.viewModel
    self.viewModel(ko.mapping.fromJSON(retrievedData,mapping,{}));
};   

ビューモデルが大きい場合、ko.mapping は非常に遅くなることに注意してください。

于 2013-01-23T13:18:41.553 に答える