我的代码不会在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 thread和another 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?
答案 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