ビューモデルを選択リストにバインドすると正しい行数が表示されるという奇妙な状況がありますが、表示されるデータは空です。オプション要素の数は正しいが、それぞれに空の値とテキストがあります。モデルの下は正しいです。値の選択は正常に機能し、保存すると、ビュー モデル コードが正しい値を保存します。何も見えないだけです。ただし、関数を使用したバインドは機能します。たとえば、これは正しく表示されます:
<select data-bind="options: promotionLevels,
optionsText: function(item) {
return item().description();
},
optionsValue: function(item) {
return item().id();
},
value: promotionLevel,
optionsCaption: 'Choose...'"></select>
これはしませんが:
<select data-bind="options: promotionLevels,
optionsText: 'description',
optionsValue: 'id',
value: promotionLevel,
optionsCaption: 'Choose...'"></select>
私はノックアウトに比較的慣れていないので、問題が何であるかを知りたい.
ありがとう
[編集] サーバーによって生成されたデータは次のとおりです。
"promotionLevels":[{"id":"f28391a0-8995-45a4-a360-1dd1ae38861b","description":"Beta"},{"id":"6fb6ad46-fff4-4da8-98ef-4ff469406a6c","description":"Development"},{"id":"f16d044a-4ea6-4001-844e-c8dad6227c04","description":"Production"},{"id":"1da6ac1f-7d31-ba64-fbce-c8623af6464f","description":"QA"},{"id":"bc34a34a-0c89-4215-a001-1ea40433b8a9","description":"Test"}]
ko 経由でバインドされたデータをダンプすると、昇格レベルは次のようになります。
"promotionLevels": [
{
"id": "f28391a0-8995-45a4-a360-1dd1ae38861b",
"description": "Beta",
"__ko_mapping__": {
"ignore": [],
"include": [
"_destroy"
],
"copy": [],
"mappedProperties": {
"id": true,
"description": true
}
}
},
{
"id": "6fb6ad46-fff4-4da8-98ef-4ff469406a6c",
"description": "Development",
...
これを jsfiddle しようとしましたが、依存関係が大きすぎます。
[編集2]
ページコードは次のとおりです。
var mapping = {
promotionLevel: {
create: function(ctx) {
return ko.observable(new Foo.ReferenceDataModel(ctx));
}
},
...
};
var viewModel = @Html.Knockout().ToViewModel(this.Model, @<text>mapping</text>);
ko.applyBindings(viewModel, $("#endpointEditor")[0]);
ビュー モデル コード:
Foo.ReferenceDataModel = $.inherit(
Foo.ViewModelBase,
{
__constructor: function(options) {
this.__base();
if (options && options.data) {
ko.mapping.fromJS(options.data, options.mapping || { }, this);
} else {
this.id = ko.observable($.generateId());
this.description = ko.observable();
}
this.save = function(data, e) {
var self = this;
var form = $(e.target).parents("form");
$.validator.unobtrusive.parse(form);
if (!$(form).valid()) {
return;
}
if (options.callback) {
options.callback(self);
}
};
}
});
これは私が継承したアプリケーションであり、モデルの複雑なセットなどがあります。基本ビュー モデルは、デフォルトのエラー処理を追加するだけです。