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.doubleX=ko.computed(函数(){return 2*viewmodel.x();})如您所见,您可以使用现有的
viemodel
变量访问属性。在这种情况下,您也可以使用此模式,如计算可观察文档中所述:
viewmodel.doubleX=ko.computed(函数(){return 2*this.x();},viewmodel)