0

我使用映射插件来创建视图模型。这是 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 成为可观察对象?

4

1 回答 1

1

映射插件为最低级别的属性和数组创建 observables。对于嵌套对象,它不会使父对象成为可观察对象。

var test = {
   sub: {
       name: "Bob"
   }
};

在这种情况下,它将成为name可观察的,但sub不会是可观察的。

一种选择是使用映射选项自定义对象的创建方式,如此所述。

于 2013-03-13T13:30:10.337 回答