Knockout.js 在运行时向模型添加可观察对象。但是ko.mapping.toJS不会返回它们

Knockout.js 在运行时向模型添加可观察对象。但是ko.mapping.toJS不会返回它们,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,js和knockout映射插件 我的问题是: 我有一个模型,并在运行时向其添加可观察对象,如下所示: viewModel[value] = new ko.observable(valueFromTextBox); 这工作正常,可观察的对象绑定到屏幕上,这部分工作正常 问题在于,当我尝试采用该模型并将其转换为JSON时,如下所示: var JSON = ko.mapping.toJS(page.model); 当我调试这个时,我看到page.model拥有所有新的可观察对象。但我最后的JSON

js和knockout映射插件

我的问题是:

我有一个模型,并在运行时向其添加可观察对象,如下所示:

viewModel[value] = new ko.observable(valueFromTextBox);
这工作正常,可观察的对象绑定到屏幕上,这部分工作正常 问题在于,当我尝试采用该模型并将其转换为JSON时,如下所示:

var JSON = ko.mapping.toJS(page.model);
当我调试这个时,我看到page.model拥有所有新的可观察对象。但我最后的JSON只包含了模型中最初使用的JSON。不是稍后在运行时添加的。 在运行时添加观测值的正确方法是什么

谢谢

编辑:

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

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

ko.mapping.fromJS(model, page.model);
之后,当用户添加我使用的新字段时,会发生绑定:

viewModel[value] = new ko.observable(valueFromTextBox);
最后,在将其发送回我使用的服务器之前:

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

在这一点上,添加的字段没有出现在JSON中。

您是指.toJSON而不是.toJS吗

这种情况对我很有效,虽然我认为你不应该使用新的,但应该是:

viewModel['PropertyName']=ko.observeValue


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

您是指.toJSON而不是.toJS吗

这种情况对我很有效,虽然我认为你不应该使用新的,但应该是:

viewModel['PropertyName']=ko.observeValue

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

调试后

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;
我在模型中添加了一个可观察对象,但也更新了mappedProperties字典 就这样。现在,当调用ko.mapping.toJS时,我的整个模型将作为JSON对象返回,包括我添加的观察值

我意识到这可能不是最优雅的方式。但它确实非常有效

调试后

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;
我在模型中添加了一个可观察对象,但也更新了mappedProperties字典 就这样。现在,当调用ko.mapping.toJS时,我的整个模型将作为JSON对象返回,包括我添加的观察值


我意识到这可能不是最优雅的方式。但它确实非常有效

好的,我不带新的试试。没有。。函数名为toJSOK,我切换到了toJSON,我的坏消息是toJS。我移除了新的。但是没有帮助也许我没有最新版本的敲除和敲除映射。我将尝试下载againI输入的映射调试。在这个函数:VisitProperties或ArrayEntries中有一个:UnwrappedRotoObject[mappingProperty]。mappedProperties和mappedProperties只包含模型的第一个初始化属性和新添加的属性。。。有什么想法吗?我认为最好的办法是试着把你的设置中的不同之处分离出来,用一把基本的小提琴来演奏。试一试这个:这是否反映了你的做法?我将编辑我的问题,使其符合我尝试做的整个场景。我还想出了一个解决办法。。。这不是最好的,但无论如何我都会把它贴出来,因为它确实有用。好的,我不带新的试试。没有。。函数名为toJSOK,我切换到了toJSON,我的坏消息是toJS。我移除了新的。但是没有帮助也许我没有最新版本的敲除和敲除映射。我将尝试下载againI输入的映射调试。在这个函数:VisitProperties或ArrayEntries中有一个:UnwrappedRotoObject[mappingProperty]。mappedProperties和mappedProperties只包含模型的第一个初始化属性和新添加的属性。。。有什么想法吗?我认为最好的办法是试着把你的设置中的不同之处分离出来,用一把基本的小提琴来演奏。试一试这个:这是否反映了你的做法?我将编辑我的问题,使其符合我尝试做的整个场景。我还想出了一个解决办法。。。它不是
我很好,但我还是会把它贴出来,因为它确实有用。你找到更好的方法了吗?我也这么做,但对梅诺来说有点棘手,我就是这么做的。它像这样运行了几个月,已经没有问题了。感觉真的很奇怪。映射插件应该内置对它的某种支持。这是最好的,我发现了一些东西:您可以使用ko.mapping.fromJSfrom、mapping和to,并将{include:[value1,value2]}作为映射对象传递。将这些值添加到ko_mapping.mappedproperties是很重要的。您找到更好的方法了吗?我也这么做,但对梅诺来说有点棘手,我就是这么做的。它像这样运行了几个月,已经没有问题了。感觉真的很奇怪。映射插件应该内置对它的某种支持。这是最好的,我发现了一些东西:您可以使用ko.mapping.fromJSfrom、mapping和to,并将{include:[value1,value2]}作为映射对象传递。将此值添加到ko_mapping.mappedProperties是非常困难的