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オブジェクトのデータが事前に入力されています。空の雇用者モデルのマッピングデータを取得するにはどうすればよいですか?