Knockout.js 如何使用敲除映射的计算函数创建新对象

Knockout.js 如何使用敲除映射的计算函数创建新对象,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,从.NET中,我得到了列表,并将其反序列化为JSON: "Item":[{"p1":1,"p2":2,....},{"p1":1,,"p2":2,....}] 我为item对象添加了一些自定义可计算函数: var Moptions = { 'Item': { create: function (options) { return (new (function (

从.NET中,我得到了
列表
,并将其反序列化为JSON:

"Item":[{"p1":1,"p2":2,....},{"p1":1,,"p2":2,....}]
我为item对象添加了一些自定义可计算函数:

    var Moptions = {
                 'Item': {
                     create: function (options) {
                         return (new (function () {

                             this.calcDateAuto = ko.computed(function () {

                         return something;
    },this);
ko.mapping.fromJS(options.data, {}, this);
我能够从敲除对象解析数据和自定义计算函数:

var viewmodel = ko.mapping.fromJS(JSON,Moptions);
我想做的是允许用户将新项目(客户端)添加到我的淘汰视图模型中。我一直在尝试使用正确的对象(请注意,我希望使用该对象的计算函数)

我找到了这个帖子。但我的情况有点不同,因为我有计算函数

编辑 解决方法是为项目创建一个空对象。有办法做到这一点吗?我试图做(不起作用):


目前项目的结构是什么?只要您确保这些值的格式相同,那么您就可以开始了。只需确保“Items”不仅仅是一个数组,而是一个可观察的数组……否则您将更改对象,但在UI中看不到它。

因此,在So上也有类似的场景,但不幸的是,在我的情况下,我在映射过程中手动向我的Item对象添加了一些计算函数

最后,我在“添加项”函数中执行了以下操作:

viewmodel.addItem = function () {
var options = {

                     create: function (options) {
                         return (new (function () {

                             this.calcDateAuto = ko.computed(function () {

                         return something;
    },this);
ko.mapping.fromJS(options.data, {}, this);
};
var item = serverModel.Item()[0];

            var newItem = ko.mapping.fromJS(ko.mapping.toJS(item),options);
            serverModel.Item.push(newItem);
}

这基本上就是在可观察数组中获取一个现有的Item对象,将其反序列化为JSON,并使用knockout映射插件将其转换回一个对象。但这里的关键是映射选项。这与“Moptions”类似,只是它不寻找“Item”对象。

我有一个Item对象列表。正如我所说的,我能够解析并获取所有Item对象的数据。我只是想知道向knockout对象添加新项的正确语法或方法。看起来你对映射函数的理解可能是罪魁祸首,但你的示例不够详细,我无法确定。如果你仍然有问题,那么你应该做一把小提琴或其他东西来最好地复制手头的问题…然后有人(比如我)可以帮助你…看起来你只是第一次使用SO。更好的答案需要格式良好的问题。好吧……我们还对您对JSFIDLE的理解有问题……您指的是jQuery,而不是提供它。另外,对ko.mapping的引用是另一个引用,不包括在您的基本淘汰框架中…必须提供它哦,而且您真的不需要提供这么大的数据集来测试所有这些…这会让人头疼
var temp = ko.toJSON(viewmodel.Item);
var newmodel = ko.mapping.fromJS(temp);
viewmodel.addItem = function () {
var options = {

                     create: function (options) {
                         return (new (function () {

                             this.calcDateAuto = ko.computed(function () {

                         return something;
    },this);
ko.mapping.fromJS(options.data, {}, this);
};
var item = serverModel.Item()[0];

            var newItem = ko.mapping.fromJS(ko.mapping.toJS(item),options);
            serverModel.Item.push(newItem);
}