2

js 和淘汰赛映射插件

我的问题是这样的:

我有模型,我在运行时向它添加 observables,如下所示:

viewModel[value] = new ko.observable(valueFromTextBox);

这工作正常,并且可观察对象绑定到屏幕,这部分工作正常有问题的部分是当我尝试采用该模型并将其转换为 JSON 时,如下所示:

var JSON = ko.mapping.toJS(page.model);

当我调试它时,我看到 page.model 具有所有新的 observables。但我最终的 JSON 只有模型中的那些。不是稍后在运行时添加的。在运行时添加可观察对象的正确方法是什么?

谢谢

编辑:

我将描述我的整个场景,然后发布我的解决方案作为答案。

我正在使用 ASP.Net MVC,我创建了一个视图模型,然后进行了 ajax 调用以从服务器接收我的实际模型。然后使用:

ko.mapping.fromJS(model, page.model);

之后,当用户添加我使用的新字段时,绑定会发生:

viewModel[value] = new ko.observable(valueFromTextBox);

最后在将其发送回我使用的服务器之前:

 var JSON = ko.mapping.toJS(page.model);

在这一点上,JSON 中不存在添加的字段。

4

2 回答 2

3

调试后

ko.mapping.fromJS(model, page.model);

我意识到该函数读取字典中的值

    __ko_mapping__.mappedProperties

这是在使用 toJS 函数期间创建的

var JSON = ko.mapping.toJS(page.model);

无论如何,因为我新添加的 observables 不存在于__ko_mapping__.mappedProperties字典中,它们也不存在于使用 ko.mapping.toJS 函数返回给我的 JSON 对象中,所以我为使其工作所做的工作是这样的:

viewModel[value] = ko.observable(valueFromTextBox);
viewModel.__ko_mapping__.mappedProperties[value] = true;

我在模型中添加了一个 observable,但也更新了 mappedProperties 字典,仅此而已。现在,当调用ko.mapping.toJS我的整个模型时,将返回一个 JSON 对象,包括我添加的 observables。

我意识到这可能不是最优雅的方式。但它确实很好用。

于 2012-08-22T11:18:13.927 回答
1

您的意思是 .toJSON 而不是 .toJS?

这种情况对我有用,虽然我认为你不应该使用“新”,它应该只是:

viewModel['PropertyName'] = ko.observable(value);

实际上,这两种方法都对我有用,无论有没有 new,但在所有使用它的文档中,它都没有使用,比如工厂方法。你能创建一个演示你的问题的小提琴吗?

于 2012-08-14T10:45:09.023 回答