在knockoutjs中自定义对象“create” - 属性绑定在加载时起作用,但在创建新对象时不起作用

时间:2013-02-17 22:12:52

标签: knockout.js

我正在使用ko.mapping.fromJS(数据,映射)方法从服务器翻译我的模型,这样我就可以为子模型添加更多属性。

按照此处的示例: http://knockoutjs.com/documentation/plugins-mapping.html => “使用”创建“自定义对象构造

这是我的代码:

var Employer = function (data) { 
        ko.mapping.fromJS(data,{}, this); 
        this.Foo = ko.observable("bar"); // added properties will go here. 

        console.log(this.Foo());      // i see this getting called OK on initial creation, and subsequent creations
        console.log(this.Name()); // ** this is only OK during initial creation, but on subsequent times i get "[Object] does not have a property Name" this property comes from the server model..** 
        }; 

        var mapping = {     
            'Employers' : { 
                create: function (options) {
                     var e = new Employer(options.data);
                     return e;
                } 
            } 
        }; 

        model = ko.mapping.fromJS(data, mapping); 

到目前为止这个工作正常!

问题发生在这里:

        model.addEmployer = function (options, o2) {
            var e = new Employer(options);
             this.Resume.Employers.push(e);
        }; 

我在这里遗漏了一些东西..当我想要在集合中添加一个新对象时,它缺少来自模型(来自服务器)的所有属性,这些属性是使用此行“ko.mapping”添加的。 fromJS(data,{},this);“在Employer构造函数内部。

我猜我需要在addEmployer函数中重复一些类似的映射,它将所有服务器端属性重新绑定到客户端模型

这是我如何调用addEmployer:

 <button data-bind="click: addEmployer">...</button>

更新

归结为,在映射中声明'create'事件时,该函数接收 options 对象,其中 options.data 可用于这个调用: ko.mapping.fromJS(data,{},this); ..我不知道如何在我的addEmployer处理程序中获取这种类型的对象,为所有属性提供必要的绑定存在于服务器上的Employer对象上。

我可以通过从初始绑定中保留options.data并在addEmployer处理程序中重用它来解决它。问题是,它是否具有从该初始对象设置的所有属性。

我基本上需要的是EmployerMappingOptions对象是空的。在上面的实现中,options.data预先填充了我的集合中第一个Employer对象的数据。 如何获取空Employer模型的映射数据

2 个答案:

答案 0 :(得分:0)

您的问题是,在添加功能

中进行映射时,您不会添加任何数据

要么:给它一个虚拟数据对象 http://jsfiddle.net/mfauL/1/

this.Employers.push(new EmployerViewModel({ Name: "" }));

或显式声明Name observable(Preffered way) http://jsfiddle.net/mfauL/2/

EmployerViewModel = function (data) { 
    this.Foo = ko.observable("bar"); 
    this.Name = ko.observable(); 

    ko.mapping.fromJS(data,{}, this); 
}; 

答案 1 :(得分:0)

找出 a 解决方案。

  1. 将有问题的子类(子模型)公开为主模型的属性

    public ResumeEmployer EmptyEmployer {         get {return new ResumeEmployer(); }

  2. 创建它的JSON表示

    var newEmployerJson = @ Html.Raw(Json.Encode(Model.EmptyEmployer));

  3. 在客户端创建新雇主时,使用空定义json进行绑定

        var Employer = function (data) { 
            if (data)
                ko.mapping.fromJS(data,{}, this);   // existing data in serialized model
            else
                ko.mapping.fromJS(newEmployerJson, {}, this); // json of single empty Employer class 
            ... 
         }