淘汰视图模型映射问题

时间:2013-12-26 21:58:13

标签: c# asp.net-mvc knockout.js

我在C#上的viewmodel看起来像这样 -

public class Level1Child
{
    public int id;
    public string name;
}
public class Parent
{
    public string name;
    public List<Level1Child> Level1Children { get; set; }    
}
public class Test
{
    public Parent Parent { get; set; }
}

这是我尝试创建viewmodel映射的方式 -

$.getJSON('Test/GetData/', null, function (value) {
        data = value;

        function Level1ChildViewModel(data) {
            var self = this;
            self.name = ko.observable(data.name);
        }

        function TestViewModel(data) {
            var self = this;

            self.Parent = function (data) {
                this.name = data.name;
                this.children = ko.observableArray([]);
                if (this.children !== null) {
                    var mappedObjects = $.map(data.Level1Children, function (eachSingleObject) {
                        return new Level1ChildViewModel(eachSingleObject);
                    });
                    self.children(mappedObjects);
                }
            };
        }
        var myvm = new TestViewModel(data);
        ko.applyBindings(myvm);
});

这就是我试图创建视图的方式 -

<span data-bind="text: name"></span>
        <!-- ko foreach: children -->
        <span data-bind="text: name"></span>
        <!-- /ko -->

但是在执行时,我收到错误 - 儿童未定义。 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

因为TestViewModel实例不包含子属性。 为什么?因为此实例有一个名为Parent的方法(创建子数组),但从不调用此方法。

我认为你可以简化如下:

function TestViewModel(data) {
     var self = this;    

     self.name = data.name;
     self.children = ko.observableArray([]);

     var mappedObjects = $.map(data.Level1Children, function (eachSingleObject) {
                 return new Level1ChildViewModel(eachSingleObject);
     });
     self.children(mappedObjects);
}