ノックアウト製本で表示されたアイテムリストがあります。簡略化すると、次のようになります。
<ul data-bind="foreach: currentItems ">
<li>
<div>
<span data-bind="text: Heading"></span>
</div>
</li>
</ul>
選択リストには、最初のリストに追加できる潜在的なアイテムがあります。値がダブルクリックされると、selectedItem で ajax 呼び出しが開始されます。
<select id="lstSongs" data-bind="options: possibleItems, optionsText: 'Heading', value: selectedItem, dblclick: $root.addItem"></select>
どちらの配列も、サーバーで定義された同じモデル構造を使用します。
ビューモデルは次のようになります。
function MyViewModel() {
var self = this;
self.currentItems = ko.observableArray([]);
self.possibleItems = ko.observableArray([]);
self.selectedItem = ko.observable();
self.addItem = function(item) {
$.ajax({
type: "POST",
url: "/api/MyController/AddItem",
contentType: "application/json",
dataType: "json",
data: ko.toJSON(item),
success: function(itemId) {
// Attempt1
alert(itemId);
item.ItemId(itemId);
alert("hello1");
alert(item.ItemId);
currentItems.push(item);
// Attempt2
alert(itemId);
item.ItemId = itemId;
alert("hello2");
alert(item.ItemId);
currentItems.push(item);
// Attempt3
alert(itemId);
selectedItem.ItemId = itemId;
alert("hello3");
alert(selectedItem.ItemId);
currentItems.push(selectedItem);
}
});
};
}
var viewModel = new MyViewModel();
var data = @Html.Raw(new JavaScriptSerializer().Serialize(Model));
ko.mapping.fromJS(data, {}, viewModel);
ko.applyBindings(viewModel);
currentItems を含むリストは、ko.mapping を使用して MVC 初期モデルからロードされます。possibleItems には、動的な ajax 呼び出しからの値が読み込まれます。しかし、両方とも期待どおりにロードされているので、それらのバインディングは問題ないと思います。
ダブルクリックは期待どおりにトリガーされます。サーバーで呼び出しが検出され、適切な itemId が返されます。正常に返された場合、その値を selectedItem に設定する必要があります。次に、selectedItem を currentItems 配列に追加し、最初のリストに表示する必要があります。
私はいくつかの試みで詳しく説明しましたが、成功しませんでした。私はそれらを一度に1つずつ試し、他の人がコメントしました。
Attempt1: itemId は返されますが、最初の hello に到達していません。なんで?それは観察可能なプロパティを設定する方法ではありませんか?
Attempt2: 値が設定され、hello2 が表示され、itemId が設定されていることが報告されました。ただし、プッシュ呼び出しでは、項目が currentItem リストに表示されません。
Attempt3: 同じアプローチですが、今回はビューモデルの selectedItem にプロパティが設定されています。今回は hello3 に到達していません。