我使用映射插件来创建视图模型。这是 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 在这里不相关,实际上工作正常。
两个问题:
1) 为什么 QuoteSelectedViewModel 映射为 Object 而不是 Observable 函数?我理解为什么 QuoteListViewModel 是这种情况,因为它是一个数组,但 QuoteSelectedViewModel 不是一个数组。
2) 我无法将我的 DOM 绑定到 QuoteSelectedViewModel。这就是我所做的:
viewModel.customizeQuote = function () {
viewModel.QuoteSelectedViewModel = this;
}
并在那里调用customQuote:
<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 数组的正确报价。但是这样做:
viewModel.QuoteSelectedViewModel = this;
对我来说似乎不正确。它应该是可观察的,我应该这样做
viewModel.QuoteSelectedViewModel( this );
知道有什么问题吗?
[编辑]
QuoteSelectedViewModel 不可观察的事实显然是问题的根源。
我添加了以下代码:
viewModel.SelectedQuote = ko.observable(viewModel.QuoteSelectedViewModel);
而在自定义方法中,我这样做:
viewModel.SelectedQuote(this);
所以现在,列表是绑定的。那么,当我使用映射插件时,如何从一开始就使 QuoteSelectedViewModel 成为可观察对象?