ko.mapping.fromJS(Model)を使用してASP.NETMVCviewModelをKnockoutJSにロードしました。
私のviewModelは次のようになります。
public IEnumerable<FunkyThing>funkyThings;
public FunkyThing selectedFunkyThing;
次に、HTMLビューに次のようなテーブルを作成しました。
<tbody data-bind="foreach: funkyThings">
<tr>
<td data-bind="text:name"></td>
<td data-bind="text:funkiness"></td>
<td><a href='#' title="Select Funky Thing" data-bind="click: $root.selectFunkyThing"></a>
</td>
</tr>
</tbody>
そして、すべてがこのテーブルで良いです。ファンキーなものを選択するリンクをクリックすると、selectFunkyThing関数が呼び出されます。
model.selectFunkyThing= function (funkyThing) {
window.location = '@Url.Action(MVC.FunkyThingController.Index())' + "?funkyThingID=" + funkyThing.funkyThingID();
};
これにより、ページが更新されます。MVCビューモデルが再ロードされ、selectedFunkyThingに選択されたFunkyThingが入力され、ノックアウトビューモデルがMVCビューモデルから再度読み取られます。ここまでは順調ですね。
次に、選択したエントリを強調表示するようにテーブルを更新したいと思いました。そこで、tr行を次のように更新しました。
<tr data-bind="css:{'selected': $root.isSelected()}">
新しいノックアウト関数を作成しました。
model.isSelected = function (funkyThing) {
return funkyThing.funkyThingID== model.selectedFunkyThing.funkyThingID;
};
しかし...それは機能していません。Chromeは、FunkyThingパラメーターが未定義であることを示すjavascript例外をスローします。技術的には、MVC viewModelを変更して、配列内の各FunkyThingにisSelectedを実際に設定することで解決できると思います。しかし、私はノックアウトからこれを行うことから離れなければならないと思いますか?