js和淘汰赛映射插件
我的问题是:
我有模型,我在运行时添加了observable,如下所示:
viewModel[value] = new ko.observable(valueFromTextBox);
这个工作正常,可观察量被绑定到屏幕上,这部分工作正常 有问题的部分是当我尝试采用该模型并将其转换为JSON时:
var JSON = ko.mapping.toJS(page.model);
当我调试这个时,我看到page.model有所有新的observable。但我的最终JSON只有那些在模型中开始的人。不是后来在运行时添加的。 在运行时添加observable的正确方法是什么?
感谢
编辑:
我将描述我的整个场景,然后将我的解决方案作为答案发布。
我正在使用ASP.Net MVC,我创建了一个视图模型然后进行了ajax调用以从服务器接收我的实际模型。然后使用:
ko.mapping.fromJS(model, page.model);
之后,当用户添加我使用的新字段时,绑定会发生:
viewModel[value] = new ko.observable(valueFromTextBox);
并且最终在将其发送回我使用过的服务器之前:
var JSON = ko.mapping.toJS(page.model);
此时添加的字段不存在于JSON中。
答案 0 :(得分:3)
调试后
ko.mapping.fromJS(model, page.model);
我意识到该函数读取字典中的值
__ko_mapping__.mappedProperties
在使用toJS功能期间进行了创建
var JSON = ko.mapping.toJS(page.model);
无论如何,因为我在__ko_mapping__.mappedProperties
字典中没有出现新添加的可观察量
在使用ko.mapping.toJS函数返回给我的JSON对象中也没有出现
所以我做的工作是:
viewModel[value] = ko.observable(valueFromTextBox);
viewModel.__ko_mapping__.mappedProperties[value] = true;
我在模型中添加了一个observable,但也更新了我的mappedProperties字典
就是这样。现在,当调用ko.mapping.toJS
时,我的整个模型将作为JSON对象返回,包括我添加的可观察对象。
我意识到这可能不是最优雅的做法。但它确实很有效。
答案 1 :(得分:1)
你的意思是.toJSON而不是.toJS?
这种情况对我有用,虽然我不认为你应该使用“新”,它应该只是:
viewModel ['PropertyName'] = ko.observable(value);
实际上这两种方式对我来说都有用,无论有没有新的,但在所有文档中都没有,就像工厂方法一样。你能创建一个演示你问题的小提琴吗?