如何使用knockout mapping创建具有计算函数的新对象

时间:2014-07-02 20:12:06

标签: knockout.js knockout-mapping-plugin

从.NET开始,我有List<Item>并将其反序列化为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);

我能够从Knockout对象解析数据和自定义计算函数:

var viewmodel = ko.mapping.fromJS(JSON,Moptions);

我想要做的是允许用户将新项目(客户端)添加到我的挖空视图模型中。我一直试图使用正确的对象(请注意我希望用对象计算函数)

viewmodel.addItem = function () {
viewmodel.Item.push( /* what should I use here */)
}

我找到了这篇文章https://stackoverflow.com/questions/18150539/adding-a-new-object-to-observable-array-in-knockout-mvc][1]。但是我的情况有点不同,因为我有计算函数。

修改 解决方法可以为Item创建一个空对象。有没有办法做到这一点?我试图这样做(没有工作):

var temp = ko.toJSON(viewmodel.Item);
var newmodel = ko.mapping.fromJS(temp);

2 个答案:

答案 0 :(得分:0)

目前物品的结构是什么?只要你确保值的格式相同,那么你应该好好去。请确保&#39;项目&#39;不仅仅是一个数组,而是一个observableArray ...否则你将改变你的对象但是没有在你的UI中看到它。

答案 1 :(得分:0)

因此在SO上有类似的情况,但不幸的是在我的情况下,我在映射过程中手动将一些计算函数添加到我的Item对象中。

我最后在Add 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映射插件将其转换回对象。但关键是映射选项。这类似于&#34; Moptions&#34;除了它没有寻找&#34;项目&#34;对象