在运行时向模型添加observable。但是ko.mapping.toJS不会返回它们

时间:2012-08-14 09:36:01

标签: knockout.js knockout-mapping-plugin

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中。

2 个答案:

答案 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);

实际上这两种方式对我来说都有用,无论有没有新的,但在所有文档中都没有,就像工厂方法一样。你能创建一个演示你问题的小提琴吗?