淘汰赛:将项目添加到分层json

时间:2015-11-01 22:07:04

标签: json knockout.js

我正在尝试Knockout映射,并且想知道是否可以将项目插入到分层json模型的子级别中。

使用像这样的Json,我可以将项目添加到子级别吗?加一个苹果?

var food = [ 
{foodGroupName: "Fruits", subGroups: [
    {subGroupName: "Apples", values: [    
        {"mytitle":"Granny Apple","mycaption":"Muffin sweet roll marshmallow."},
        {"mytitle":"Green Apple","mycaption":"Jelly beans sugar plum lemon drops."},
        {"mytitle":"Crab Apple","mycaption":"Sesame snaps gingerbread pudding cupcake."}
    ]},
    {subGroupName: "Oranges", values: [   
        {"mytitle":"Navel Orange","mycaption":"Muffin sweet roll marshmallow."},
        {"mytitle":"Blood Orange","mycaption":"Jelly beans sugar plum lemon drops."},
        {"mytitle":"Mandarin Orange","mycaption":"Sesame snaps gingerbread pudding cupcake."},
        {"mytitle":"Clementine","mycaption":"Pudding jelly-o dessert soufflé."}
    ]}
]
},
{foodGroupName: "Vegetables", subGroups: []},
{foodGroupName: "Proteins", subGroups: []}

];

我把小提琴放在一起: http://jsfiddle.net/e7bmt74b/5/

我想制作"添加新的"按钮添加一种新类型的苹果,并将其添加到Json中,如textarea所示。

1 个答案:

答案 0 :(得分:0)

您应该认真考虑重组数据。现在插入苹果并不容易,因为你需要得到数组的第一项(恰好是水果部分),然后插入适当的子组(恰好是第一个子组)。

this.addApple = function() {
    self.foods()[0].subGroups()[0].values.push({
        mytitle: ko.observable('New Apple Title'),
        mycaption: ko.observable('New Apple Caption'),
    });
};

JSFiddle

我注意到你正在使用映射插件。虽然对某些情况有好处,但我建议不要先使用它。它实际上使这样的事情变得更加困难。花点时间建立一些好的领域模型。理想情况下,你有更多这样的东西。

this.addApple = function () {
    self.fruits().apples.push(new Apple());
};

或者甚至更好,让一个"水果"对象处理它。

this.addApple = function () {
    self.fruits.addApple();
};

tl; dr:这不是一件容易的事,因为你的数据结构很复杂。