Javascript 将从服务器接收的对象转换为具有可观察属性的对象
我对一个看似简单的想法有意见 我试图从服务器提供的数据动态创建Javascript 将从服务器接收的对象转换为具有可观察属性的对象,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,我对一个看似简单的想法有意见 我试图从服务器提供的数据动态创建ko.observable() 服务器正在向我发送一个约240值的JSON数组。当我把它们放到一个在线表单中时,我想为每一个创建一个可观察的对象 初试 有了这个,我无法访问任何数据 第二次尝试有效吗 我想做什么 然后像这样访问它: <input type="text" data-bind="value: data.case_id"> 第一次尝试时,我的视图模型中没有数据。如果我在Chrome控制台中调出vm变量,它确
ko.observable()
服务器正在向我发送一个约240值的JSON数组。当我把它们放到一个在线表单中时,我想为每一个创建一个可观察的对象
初试
有了这个,我无法访问任何数据
第二次尝试有效吗
我想做什么
然后像这样访问它:
<input type="text" data-bind="value: data.case_id">
第一次尝试时,我的视图模型中没有数据。如果我在Chrome控制台中调出vm
变量,它确实有数据
我做错什么了吗?第二种方法在有这么多可见光的情况下看起来不太好
如果我遗漏了一些明显的东西,请告诉我
个人解决方案
最后,我在应用绑定和AJAX服务器请求之间遇到了竞争条件。我还使用了@JotaBe推荐的插件,这在过去对我来说是可靠的:
jsonToObservable = function (obj, data) {
for (var p in data) {
var temp = data[p];
obj[p] = ko.observable(temp);
}
};
这在过去对我来说是可靠的:
jsonToObservable = function (obj, data) {
for (var p in data) {
var temp = data[p];
obj[p] = ko.observable(temp);
}
};
你可以使用插件,它将为你做这件事
其优点是该插件经过良好测试,能够映射更复杂的数据,如数组或嵌套属性
可以从JSON映射,也可以从已经实例化的JavaScript对象映射。synatx非常简单,如下所示:
var viewModel = ko.mapping.fromJSON(data);
另一个优点是,它还可以根据来自服务器的新更新数据更新本地映射副本,而无需重建整个对象。这也有助于更新视图,而无需重建(或解除绑定)视图
最后一个优势是,如果您需要将JSON或JavaScript对象发回服务器,它还允许取回JSON或JavaScript对象,如下所示:
var unmapped = ko.mapping.toJS(viewModel);
你可以使用插件,它将为你做这件事
其优点是该插件经过良好测试,能够映射更复杂的数据,如数组或嵌套属性
可以从JSON映射,也可以从已经实例化的JavaScript对象映射。synatx非常简单,如下所示:
var viewModel = ko.mapping.fromJSON(data);
另一个优点是,它还可以根据来自服务器的新更新数据更新本地映射副本,而无需重建整个对象。这也有助于更新视图,而无需重建(或解除绑定)视图
最后一个优势是,如果您需要将JSON或JavaScript对象发回服务器,它还允许取回JSON或JavaScript对象,如下所示:
var unmapped = ko.mapping.toJS(viewModel);
注意:此解决方案无法正确映射数组(如果它们来自服务器)和嵌套属性(如果服务器返回嵌套对象)。因此,这只适用于来自服务器的简单对象,它只包括非数组属性。@JotaBe服务器只提供一个简单对象。因此,这将起作用。非常感谢。注意:此解决方案无法正确映射数组(如果它们来自服务器)和嵌套属性(如果服务器返回嵌套对象)。因此,这只适用于来自服务器的简单对象,它只包括非数组属性。@JotaBe服务器只提供一个简单对象。因此,这将起作用。非常感谢。如果我使用该插件,向ViewModel添加附加功能的最佳方法是什么?i、 计算变量。您可以稍后在创建的对象上简单地添加功能。例如:
viewmodel.doubleX=ko.computed(函数(){return 2*viewmodel.x();})代码>如您所见,您可以使用现有的viemodel
变量访问属性。在这种情况下,您也可以使用此模式,如计算可观察文档中所述:viewmodel.doubleX=ko.computed(函数(){return 2*this.x();},viewmodel)如果你遇到麻烦,请提出一个新问题。不,那太好了。非常感谢你!如果我使用该插件,向ViewModel添加附加功能的最佳方法是什么?i、 计算变量。您可以稍后在创建的对象上简单地添加功能。例如:viewmodel.doubleX=ko.computed(函数(){return 2*viewmodel.x();})代码>如您所见,您可以使用现有的viemodel
变量访问属性。在这种情况下,您也可以使用此模式,如计算可观察文档中所述:viewmodel.doubleX=ko.computed(函数(){return 2*this.x();},viewmodel)如果你遇到麻烦,请提出一个新问题。不,那太好了。非常感谢你!