如何确保属性被映射为可观察的

时间:2013-02-26 23:27:30

标签: asp.net-mvc-3 knockout.js knockout-mapping-plugin

所以我有一个像这样的ViewModel:

public class ViewModel{
   // Constructors, other properties
   public List<ItemViewModel> Items { get; set; }
   public ItemViewModel SelectedItem {get;set;}

   public void InitializeViewModel(){
       //Case 1:
       SelectedItem = null;
       //Case 2:
       SelectedItem = Item.FirstOrDefault();

   }
}

在我的cshtml中,我有以下内容:

var viewModel = ko.mapping.fromJS(@Html.Raw(Model.ToJson()));

我注意到这一点是 ko.mapping.fromJS Case 1 绑定为observable。但是,当设置 Case 2 时,ko.mapping.fromJS不会将SelectedItem映射为observable。

如何设置我的代码以便实现Case2并且ko.mapping.fromJS映射SelectedItem属性?

以下是破解代码:https://skydrive.live.com/redir?resid=33048714B5BF3B4B!1261

1 个答案:

答案 0 :(得分:2)

在您的情况下,ko.mapping会将ItemViewModel的属性映射到observable,但不会映射到ItemViewModel本身。如果要使ItemViewModel映射,可以将映射定义为:

var mapping = {
            'SelectedItem': {
                create: function (options) {
                    return ko.observable(options.data);
                }
            }

并调用js转换:

var viewModel = ko.mapping.fromJS(@Html.Raw(Model.ToJson()), mapping);