ビューモデルの作成にはマッピング プラグインを使用します。Chrome からのウォッチャー出力は次のとおりです。
viewModel: Object
Id: function observable()
Language: function observable()
QuoteListViewModel: Object
QuoteSelectedViewModel: Object
MVC モデルは次のとおりです。
public class QuoteRequestViewModel
{
public Guid Id { get; set; }
public LanguageEnum Language { get; set; }
public QuoteViewModel QuoteSelectedViewModel { get; set; }
public QuoteListViewModel QuoteListViewModel { get; set; }
}
QuoteViewModel は次のとおりです。
public class QuoteViewModel
{
public string ProductName { get; set; }
public decimal MonthPrice { get; set; }
public decimal QuarterPrice { get; set; }
public decimal BiannualPrice { get; set; }
public decimal YearPrice { get; set; }
public List<CoverQuoteViewModel> CoverQuotesViewModel { get; set; }
}
QuoteListViewModel はここでは関係なく、実際には正常に動作します。
2 つの質問:
1) QuoteSelectedViewModel が Observable 関数ではなく Object としてマップされるのはなぜですか? QuoteListViewModel は配列であるため、その理由は理解できますが、QuoteSelectedViewModel は配列ではありません。
2) DOM を QuoteSelectedViewModel にバインドできません。これが私がすることです:
viewModel.customizeQuote = function () {
viewModel.QuoteSelectedViewModel = this;
}
そして、customizeQuote がそこで呼び出されます。
<table data-bind="with: QuoteListViewModel">
<tbody>
<tr data-bind="foreach: Quotes">
<td>
<a class="btn btn-primary" href="#" data-bind="click: $root.customizeQuote">Customize</a>
</td>
</tr>
デバッグすると、QuoteSelectedViewModel に QuoteListViewModel 配列からの正しい Quote が含まれていることがわかります。ただし、次のことを行います。
viewModel.QuoteSelectedViewModel = this;
私には間違っているようです。それは観察可能であるべきであり、私はすべきです
viewModel.QuoteSelectedViewModel( this );
何が問題なのですか?
[編集]
QuoteSelectedViewModel が観察可能でないという事実は、明らかに問題の根源です。
次のコードを追加しました。
viewModel.SelectedQuote = ko.observable(viewModel.QuoteSelectedViewModel);
そしてcustomizeメソッドでは、代わりにこれを行います:
viewModel.SelectedQuote(this);
これで、リストがバインドされました。では、マッピング プラグインを使用するときに、最初から QuoteSelectedViewModel を監視可能なオブジェクトにするにはどうすればよいでしょうか。