私はここ数日、次のKnockoutJSの問題を調査してきました。
3つのビューモデルがあるページがあります。バインディングを指定するためにidを持つdivを使用しています。
ko.applyBindings(new viewModel(datasource), $("#sectionQualifications")[0]);
また、RequireJSを使用しています。これは、アプリをモジュール化するのに非常に役立ち、もちろんKnockoutJSでもうまく機能します。
私の質問は、(前述のように)私のページに3つのビューモデルがあることに関するものです。重複するものはありませんが、各ビューモデルにはSAVE機能があります。したがって、ビューモデルスニペットの1つを簡単に見てみましょう。
function viewModel(data) {
self = this;
self.quals = ko.observableArray(data),
self.addQual = function () {
self.quals.push(new qualification());
},
self.remove = function (item) {
// Remove from the database IF we have an actual record in our viewmodel
if (item.Id !== 0) {
dataservice_qualifications.deleteEntity(item.Id, ko.toJSON(item),
{
success: function (ret) {
common.notifyOK('Qualification removed');
},
error: function (err) {
common.notifyError('Cannot remove that qualification');
console.log('Qualification Remove Error', err);
console.log('Remove error object', this.Id);
}
}
);
}
// Remove from the actual view model
self.quals.remove(item);
}
// Save and move on.. we need to iterate through the qualifications, update any existing rows (ID NOT 0) or
// add new entries (ID IS 0)
self.save = function () {
var saveData = ko.toJS(this.quals);
for (var i in saveData) {
// New qualification entry
if (saveData[i].Id === 0) { // New qualification entry
dataservice_qualifications.postEntity(ko.toJSON(saveData[i]),
{
success: function (ret) {
},
error: function (error) {
common.notifyError('Cannot add qualification ' + saveData[i].qualificationName);
console.log('Qualification add error', error);
}
}
);
} // eof NEW qualification
if (saveData[i].Id > 0) {
dataservice_qualifications.putEntity(saveData[i].Id, ko.toJSON(saveData[i]),
{
success: function (ret) {
},
error: function (error) {
common.notifyError('Cannot update qualification ' + saveData[i].qualificationName);
console.log('UPDATED: ERROR:', error);
}
}
);
} // eof UPDATED qualification
} // eof saveData loop
common.notifyOK('Qualifications updated');
} // eof savenext function
return;
};
したがって、上記のサンプルから、上記のSAVE関数を持つ類似した他の2つのビューモデルがあります。したがって、もちろん、jQueryを使用してボタンをクリックし、3つのビューモデルすべてを保存します(つまり、それぞれのSAVE関数を使用します)。
RequireJSを使用しているため、このスニペットで次のようにviewModel.save()関数を内部的に呼び出そうとする「public」関数を公開しようとしました。
function saveModel() {
viewModel.save();
}
// PUBLIC INTERFACE
return {
saveModel: saveModel,
loadViewModel: koMapData
}
では、理論的には、ビューモデルの保存をトリガーする場所から「saveModel」関数を呼び出すことができますか?
どんな助けでも本当にありがたいです。ちなみに、私は次のようなビューモデルを作成しようとしています。
var viewModel = {
save: function() {
blah blah...
}
}
しかし、それでも本当の運はありませんか?どういうわけか、ビューモデルから関数を外部からトリガーできると思うので、単純なものが欠けていると確信しています。
編集 参考までに、モデルは重複していません。
よろしくお願いします、デビッド。