フィールドをjson文字列および配列として返すretrieveEntity Webサービスメソッドがあります。ビューモデルをそのまま維持しながら、これらのフィールドをテキストボックスにバインドするのに問題があります。まず、データを初期化して保存するために ajax 呼び出しを行います。次に、ビューモデル内で値を取得し、目的のテキスト ボックスにバインドします。コードは次のとおりです。
<script type="text/javascript" language='javascript'>
jQuery(function () {
myViewModel = new viewmodel();
ko.applyBindings(myViewModel);
});
var invoice = function () {
var initializeURL = "ajaxwebservicecalls.asmx/RetrieveEmptyEntity";
$.ajax({
type: "Post",
url: initializeURL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function retrieveemptyesuccess(msg) {
passedmodel = (msg.d.Data);
var data = ko.mapping.fromJS(passedmodel);
var x = $.toJSON(passedmodel)
},
Error: function initializefail(msg) { alert(msg) }
});
}
X が返すものの小さなスニペットを次に示します。
{
"Entities": {
"Entity": [{
"Index": "1",
"Name": "BatchNumber",
"Value": ""
}, {
"Index": "2",
"Name": "InvoiceNumber",
"Value": ""
}]
},
"APInvoiceHeader": {
"VoucherNumber": "",
"PayLocationID": "",
"InvoiceDescription": "",
"InvoiceTypeID": "",
"TermsRuleID": "",
"TaxTypeID": "",
"RecurringInvoice": 0,
"APInvoiceItems": [{
"FixedAssetReferences": [{
"FixedAssetReferenceId": 0,
"FixedAssetReferenceIdSpecified": true,
"FormattedGLAccount": ""
}]
}
次に、返されたデータに基づいてビューモデルを構築します。
var passedmodel;
var myViewModel;
var viewmodel = function () {
this.invoice = ko.observable(new invoice());
this.arrayentity = ko.observableArray([new invoice("ff"), new invoice("dd"), new invoice("zz"), new invoice("rr")]);
this.RetrieveEntity = function () {
var retrieveURL = "ajaxwebservicecalls.asmx/RetrieveEntity";
$.ajax({
type: "Post",
url: retrieveURL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function retrievesuccess(msg) {
passedmodel = msg.d.Data;
myViewModel.invoice(ko.mapping.fromJS(passedmodel, {}, myViewModel)); }
// 上記を使用できるようにしたいので、HTML バインディングで次のように指定します。
data-bind="value:myViewModel.invoice().APInvoiceHeader.VoucherNumber"
また
data-bind="value:myViewModel.arrayentity().Entities.Entity()[0].Name"
ただし、バインディング構文でエラーが発生します。代わりに、ビューモデルを解析して全体として使用することはできません:
myViewModel.invoice(ko.mapping.fromJS(passedmodel.APInvoiceHeader, {}, myViewModel));
また
myViewModel.arrayentity([(ko.mapping.fromJS(passedmodel.Entities.Entity[0])), (ko.mapping.fromJS(passedmodel.Entities.Entity[1]))]);
HTMLバインディングは次のようになります
data-bind="value:myViewModel.invoice().VoucherNumber
また
data-bind="value:myViewModel.arrayentity()[0].Name"
これは問題なくバインドされますが、それは私がビューモデルをどのように見せたいかではありません。ビューモデルをそのまま保持して解析またはナビゲートする必要があるのは、次に画面上の値を更新する必要があるためです。これにより、ビューモデルが更新され、ビューモデルが JS に変換され、保存する別の ajax 呼び出しに渡されます。新しいデータ。
誰でも助けてもらえますか?ヒントをいただければ幸いです。ありがとう!