1

私のMVCモデルクラスとして以下を見てみましょう:

public class Candidate
{
    public string FirstName { get; set; }
    public string LastName { get; set; }        
    public string Email { get; set; }
    public int Experience { get; set; }
    public List<Technology> Technologies { get; set; }
}

public class Technology
{
    public string Technology { get; set; }
    public int ExperinceInMonths { get; set; }
} 

これで、このモーダル データを返す Web API メソッドができました。

public class CandidateController : ApiController
{
    // GET api/Candidate
    public IEnumerable<Candidate> Get()
    {
        CandidateServiceClient client = new CandidateServiceClient();

        List<Candidate> candidateData = client.GetCandidateData();

        if (candidateData == null || candidateData.Count() == 0)
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NoContent));

        return candidateData.AsEnumerable(); 
    }
     ...

Knockout を使用して、次のような JavaScript があるとします。

         $.get(url, function (result) {
           candidateViewModel.candidates(result);
           ko.applyBindings(candidateViewModel); 
       }); 
    });
 var candidateViewModel = { candidates:  ko.observableArray([])};

この背景で、私の質問は、ネストされたコレクションを持つノックアウトビューモデルを構築する方法ですか? (この例のテクノロジー コレクションのようなものです。)

のようなものを探しています..

var myViewModel = { firstName: ko.observable(''), lastName: ko.observable(''), .. };

どんな助けでも大歓迎です...

4

2 に答える 2

3

私の意見では、モデルが非常に複雑になる場合に備えて、ko.mapping.fromJS を使用する必要があります。ビュー モデルを変更する必要はありません。

参照: http://knockoutjs.com/documentation/plugins-mapping.html

于 2012-11-03T09:52:20.183 に答える
0

この出力は非常に厄介ですが、アイデアを示しています。ここで重要なのは、javascript にモデルCandidateとモデルを組み込み、それらのコンストラクターを呼び出すために使用することです。これがフィドルです。注: 値を変更する予定がない場合、モデルにオブザーバブル プロパティを含める必要はありません。TechnologyarrayMap

モデル:

var Technology = function(name, monthsExperience){
    this.name = ko.observable(name);
    this.monthsExperience = ko.observable(monthsExperience);
};

var Candidate = function(data){

    this.firstName = ko.observable(data.FirstName || '');
    this.lastName = ko.observable(data.LastName || '');
    this.email = ko.observable(data.Email || '');
    this.experience = ko.observable(data.Experience || '');

    this.technologies = ko.observableArray(ko.utils.arrayMap(data.Technologies || [],
        function(i){
            return new Technology(i.Technology, i.ExperinceInMonths);
        }));
};

メイン ビューモデル:

var App = function(initialData){
    this.candidates = ko.observableArray(ko.utils.arrayMap(initialData|| [],
        function(i){
            return new Candidate(i);
        }));
};
于 2012-07-03T19:53:02.853 に答える