Knockout.js向子元素添加属性

时间:2017-04-17 06:12:13

标签: javascript knockout.js

我的代码不会在knockout viewmodel的子元素下创建一个由knockout.mapping.fromJS映射的新属性。

我有:

//model from Entity Framework
console.log(ko.mapping.toJSON(model));
var viewModel = ko.mapping.fromJS(model, mappingOption);
ko.applyBindings(viewModel);
console.log(ko.mapping.toJSON(viewModel));

第一个console.log输出:

{
  "Id": 0,
  "CurrentUser": {
    "BoardIds": [
      {
        "Id": 0
      }
    ],
    "Id": 1,
    "UserName": "foo",
    "IsOnline": true
  },
  "Boards": []
}

然后mappingOption是:

var mappingOption = {
    create: function (options) {
        var modelBase = ko.mapping.fromJS(options.data);

        modelBase.CurrentUser.UserName = ko.observable(model.CurrentUser.UserName).extend({ rateLimit: 1000 });

        //some function definitions

        return modelBase;
    },
    'CurrentUser': {
        create: function (options) {
            options.data.MessageToPost = ko.observable("test");
            return ko.mapping.fromJS(options.data);
        }
    }
};

我提到this post来创建自定义映射,但它似乎不起作用,因为第二个console.log向第一个输出相同的JSON。

另外,我尝试根据this threadanother one创建嵌套映射选项,但它也不起作用。

var mappingOption = {
    create: function (options) {

        //modelBase, modifing UserName and add the functions

        var mappingOption2 = {
            'CurrentUser': {
                create: function (options) {
                    return (new(function () {
                        this.MessageToPost = ko.observable("test");
                        ko.mapping.fromJS(options.data, mappingOption2, this);
                    })());
                }
            }
        }
        return ko.mapping.fromJS(modelBase, mappingOption2);
    }
};

如何正确地将新属性添加到原始viewmodel?

1 个答案:

答案 0 :(得分:1)

从ko.toJS的映射documentation(toJS和toJSON以与文档中所述相同的方式工作)

  
      
  • 取消映射
  •   
     

如果要将映射对象转换回常规JS对象,请使用:    def clean(self): ''' Grouped cleaning ''' cleaned_data=super().clean() selectedDepartment=cleaned_data.get('department') print(str(type(selectedDepartment))) #gives <class 'company.models.Service'>   这将创建一个未映射的对象,其中仅包含作为原始JS对象一部分的映射对象的属性

如果您希望json包含您手动添加的属性,请使用var unmapped = ko.mapping.toJS(viewModel);代替ko.toJSON来包含所有内容,或者在首次创建对象时使用include选项来指定要添加的属性。

ko.mapping.toJSON

编辑:在您的特定情况下,您的映射选项相互冲突。您已为CurrentUser字段设置了特殊指令,但随后在create function中重写了它们。以下是我认为您的映射选项应如下所示:

var mapping = {
    'include': ["propertyToInclude", "alsoIncludeThis"]
}
var viewModel = ko.mapping.fromJS(data, mapping);

这是一个工作示例的fiddle