Knockout.js 在运行时向模型添加可观察对象。但是ko.mapping.toJS不会返回它们
js和knockout映射插件 我的问题是: 我有一个模型,并在运行时向其添加可观察对象,如下所示: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
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是非常困难的