0

ko.mapping.fromJS(data、mapping)メソッドを使用してサーバーからモデルを変換しているので、サブモデルにさらにプロパティを追加できます。

ここの例に従ってください: http ://knockoutjs.com/documentation/plugins-mapping.html= >「「作成」を使用したオブジェクト構築のカスタマイズ</p>

これが私のコードです:

var Employer = function (data) { 
        ko.mapping.fromJS(data,{}, this); 
        this.Foo = ko.observable("bar"); // added properties will go here. 

        console.log(this.Foo());      // i see this getting called OK on initial creation, and subsequent creations
        console.log(this.Name()); // ** this is only OK during initial creation, but on subsequent times i get "[Object] does not have a property Name" this property comes from the server model..** 
        }; 

        var mapping = {     
            'Employers' : { 
                create: function (options) {
                     var e = new Employer(options.data);
                     return e;
                } 
            } 
        }; 

        model = ko.mapping.fromJS(data, mapping); 

これまでのところ、これは問題なく機能します。

ここで問題が発生します:

        model.addEmployer = function (options, o2) {
            var e = new Employer(options);
             this.Resume.Employers.push(e);
        }; 

ここに何かがありません。コレクションに新しいオブジェクトを追加したい場合、この行「ko.mapping.fromJS(data」で追加されたモデル(サーバーから)からのすべてのプロパティがありません。 、{}、this);"Employerコンストラクター内。

すべてのサーバー側のプロパティをクライアントモデルに再バインドするaddEmployer関数内で同様のマッピングを繰り返す必要があると思います

これが私がaddEmployerと呼んでいる方法です:

 <button data-bind="click: addEmployer">...</button>

アップデート

つまり、マッピングで「create」イベントを宣言すると、その関数は、この呼び出しで使用できるoptions.dataを持つoptionsオブジェクトを受け取ります。ko.mapping.fromJS(data、{}、this); .. addEmployerハンドラーでこのタイプのオブジェクトを取得して、サーバー上のEmployerオブジェクトに存在するすべてのプロパティに必要なバインディングを提供する方法がわかりません。

最初のバインディングからそのoptions.dataを保持し、それをaddEmployerハンドラーで再利用することで、ハックすることができます。それに関する問題は、その初期オブジェクトから設定されたすべてのプロパティを持つことです。

私が基本的に必要としているのは、空のEmployerMappingOptionsオブジェクトです。上記の実装では、options.dataには、コレクション内の最初のEmployerオブジェクトのデータが事前に入力されています。空の雇用者モデルのマッピングデータを取得するにはどうすればよいですか?

4

2 に答える 2

0

解決策を見つけまし

  1. 問題のサブクラス(サブモデル)をメインモデルのプロパティとして公開します

    public ResumeEmployer EmptyEmployer {get {return new ResumeEmployer(); }}

  2. それのJSON表現を作成します

    var newEmployerJson = @ Html.Raw(Json.Encode(Model.EmptyEmployer));

  3. クライアントで新しい雇用主を作成するときは、バインディングに空の定義jsonを使用します

        var Employer = function (data) { 
            if (data)
                ko.mapping.fromJS(data,{}, this);   // existing data in serialized model
            else
                ko.mapping.fromJS(newEmployerJson, {}, this); // json of single empty Employer class 
            ... 
         }                  
    
于 2013-02-19T18:01:50.983 に答える
0

問題は、add関数でマッピングするときにデータを追加しないことです

いずれか:ダミーのデータオブジェクトを指定します http://jsfiddle.net/mfauL/1/

this.Employers.push(new EmployerViewModel({ Name: "" }));

または、名前を監視可能に明示的に宣言します(推奨される方法) http://jsfiddle.net/mfauL/2/

EmployerViewModel = function (data) { 
    this.Foo = ko.observable("bar"); 
    this.Name = ko.observable(); 

    ko.mapping.fromJS(data,{}, this); 
}; 
于 2013-02-18T08:18:42.940 に答える