使用ember数据保存parent_id关系

时间:2013-08-25 23:57:47

标签: ember.js ember-data

好。我已经对谷歌和其他来源提供了真实的好看,但我还没有找到问题的答案。

我有两种模式:

App.Kid = Ember.Model.extend
    title: DS.attr "string"
    parent: DS.belongsTo "App.Parent"

App.Parent = Ember.Model.extend
    title: DS.attr "string"
    kids: DS.hasMany "App.Kid"

这里的大多数问题讨论从侧载的JSON数据中检索ember数据关系,我能够做到这一点。我需要知道的是如何在创建新孩子时保存parent_id?

目前我正在App.KidController中保存一个新孩子,如下所示:

App.ParentController = Ember.ObjectController.extend
    needs: [ "widgets" ]

App.KidCreateController = Ember.ObjectController.extend
    needs: [ "dashboard" ]

    saveChild: ->
        @content.get( "store" ).commit()

保存时没有看到parent_id,但是我得到一个id为0的新父对象(分配给父键)。

有谁可以解释我在这里做错了什么?

更新1

因此,根据我的实际情况,我会解释我在做什么。

用户有多个仪表板,其上附有多个小部件。我的模型结构如下所示:

App.Dashboard = DS.Model.extend
    title: DS.attr "string"
    widgets: DS.hasMany "App.Widget"

App.Widget = DS.Model.extend
    title: DS.attr "string"
    type:  DS.attr "string"
    ...
    dashboard: DS.belongsTo "App.Dashboard"

2 个答案:

答案 0 :(得分:1)

  

首先请注意,您已使用ember-data标记了您的问题,但是您使用Ember.Model.extend定义了模型,这些模型在使用ember-model作为您的持久性库时使用,因此您应该更改它以DS.Model.extend或以不同的方式标记您的问题,我在答案中假设ember-data

如果您的App.Kid模型属于具有App.Parent数组的kids,那么您应使用ParentController来保存属于该父级的新Childs,这样您就可以了将有权访问父id及其kids数组,您需要将新的Childs推入其中。

实施例

给出一个像这样的简单模板:

{{#each parent in model itemController="parent"}}
   <strong>(id: {{parent.id}}) {{parent.title}}</strong>
   <div class="well">
     <strong>Kids</strong>
     <ul>
     {{#each kid in parent.kids}}
       <li>(id: {{kid.id}}) {{kid.title}}</li>
     {{/each}}
     </ul>
     Kid name: {{input valueBinding="newKidName"}} <button class="btn btn-info" {{action saveChild newKidName}}>Add kid</button>
   </div>
{{/each}}

然后,您应该为每个父项定义ParentController并在那里创建saveChild函数:

App.ParentController = Ember.ObjectController.extend({
  needs: ['dashboard'],
  saveChild: function(newKidName) {
   // get the dashboard id you want with
   // this.get('controllers.dashboard').get('id');
   // this assumes you have one dashboard?

   // create the new child
    var newKid = App.Kid.createRecord({title: newKidName});
    // push the newly created child into the parent's kids array
    this.get('content').get('kids').pushObject(newKid);
    // commit changes to the parent
    this.get('content').get('store').commit();
  }
});

请参阅此处以获取示例的简单演示:http://jsbin.com/odosoy/115/edit

希望它有所帮助。

答案 1 :(得分:1)

好吧,事实证明我是个白痴。我正在使用Laravel作为我的后端,在定义模型时,您需要定义哪些属性是可填充的,但是我忘了将dashboard_id添加到列表中。现在一切都很好。