主干保存嵌套集合

Backbone save nested collection

本文关键字:集合 嵌套 保存      更新时间:2023-09-26

我有这样的模型

defaults:{
    id:'',
    name: '',
    type: new typeCollection()
},
parse: function(response){
    var self = this;
    var typeCol = typeCollection;
    typeCol.fetch({ data: $.param({ id: response.id}),
        success: function (collection, response) {
            self.set('type', response);
        }}
    });
    return response; 
...
  console.log(model.attribute)
//{"id":"7","name":"myName","type":[{"tid": "2","tName": "myTName"},{"tid": "3","tName": "mOTName"}]}

视图

Marionette.ItemView.extend({        
    template: _.template(myTpl),
    initialize: function(options){
        this.model = options.model;
        this.listenTo(this.model, 'change', this.render); 
    },      
    events:{
        "click #saveChanges":"saveIt"
    },      
    saveIt: function(e) {
        e.preventDefault();
        var form = this.$('#basic_info');
        var arr = form.serializeArray();
        var data = _(arr).reduce(function(acc, field) {
          acc[field.name] = field.value;
          return acc;
        }, {});         
        this.model.save(data);
console.log(data)//{"id":"7","name":"yourName","tName[0]": "myTName","tName[1]": "mOTName"}

模板:更新:将索引添加到t名称

<form id="basic_info">
    <input name="myName" value="<%= myName%>" type="text">
      <% _.each(type, function(item, index) { %> 
    <input name="tName[index]" value="<%= item.tName %>" type="text">
      <% }); %>
</form>

这是有效的,它完成了输入字段。但我无法更新(save())嵌套的"类型"集合。如何正确更新嵌套集合而不丢失与其父模型的"连接"?

感谢你的回答和评论,我使它工作,我不得不改变模板和我如何从表单中获取数据的方式。

这是解决方案

模板:

<% _.each(type, function(item) { %>
   <div  data-nested="true" data-item-id="<%= item.tid %>" >
     <input  name="itemName" value="<%= item.tName %>" type="text">
   </div>
<% }); %>

视图:

//serialize only static part of the form
var rootInfo = _.object(_.map($('.serialize :input').serializeArray(), _.values))
var type= [];   
form.find('div[data-nested=true]').each(function(){
var self = $(this);     
  var tid    = self.data('item-id');
  var tName= self.find('input[name=itemName]').val();
     type.push({'tid'   :tid,
                'tName':tName })
 })
//merge basic info with type
_.extend(rootInfo , {type:type}) 
this.model.save(rootInfo);

Form只能有一个名称为tName/tid的字段,因此请尝试将模板更改为

<form id="basic_info">
    <input name="myName" value="<%= myName%>" type="text">
      <% _.each(type, function(item) { %> 
    <input name="tName[]" value="<%= item.tName %>" type="text">
      <% }); %>
</form>

然后你就有能力在保存之前获取所有数据并进行操作

您将在formData中获得一个字段数组,因此需要将所需字段设置为模型字段的数组。如果您需要代码示例-请在jsbin上创建测试,并提供链接-社区将添加代码