1

我有这个小应用程序,我试图将多个水果选择添加Ember.Select到模型的属性中,即 Person Alice 的“myfruits”。然而,事情被打破了。

也许我的模型设置不正确。

这是 html 中的 Ember.Select 把手:

  {{view Ember.Select
      multiple="true"
      contentBinding="App.fruits"
      valueBinding="pickedFruits"
  }}

这是模型:

App.Person = DS.Model.extend({
  name: DS.attr('string'),
  myfruits: DS.hasMany('App.Fruit')
});

App.Fruit = DS.Model.extend({
  kind: DS.attr('string'),
  likedBy: DS.hasMany('App.Person')
});

这是尝试保存多项选择的功能:

 pickThem: function(){
    var input_fruits = this.get('pickedFruits');
    // should I create a Fruit object for each input_fruits?
    var aperson = App.Person.createRecord({
      name: "Alice",
      myfruits: input_fruits
    });
    aperson.save();
 }

我觉得问题可能是我没有创建 Fruit 对象。但我不确定如何让它与 Person 和 Fruit 之间的多对多关系一起工作。

4

1 回答 1

1

我想您需要做的是正如您已经提到的那样App.Fruit为每个选定的水果创建一个记录并将其添加到新创建的App.Person.

基本上重要的一点是:

App.PersonController = Ember.ArrayController.extend({
  pickThem: function(){
    var aperson = App.Person.createRecord({name: "Alice", myfruits: []});
    this.get('pickedFruits').forEach(function(item){
      aperson.get('myfruits').pushObject(App.Fruit.createRecord({kind:item, likedBy:[aperson.get('id')]}));
    });

    aperson.save();
  }
});

然后为您的person模板提供一个模型:

App.PersonRoute = Ember.Route.extend({
  model: function() {
    return App.Person.find();
  }
});

在您的模板中,您可以遍历人员记录并在该循环内遍历他们各自的果实:

{{#each model}}
  {{name}} likes are:
  {{#each myfruits}}
    {{kind}}
  {{/each}}
{{/each}}

看看这个更新的jsbin

但是,您应该重置本地存储适配器的数据以避免在每次应用程序初始化后出现多个条目。我通过为 的命名空间创建一个伪随机后缀来完成它LSAdapter,但这可能是您觉得更方便的任何东西。

App.LSAdapter = DS.LSAdapter.create({
  namespace: 'app-emberjs-'+Math.floor(Math.random()*1000)
});

希望能帮助到你。

编辑

在阅读了您的最后一条评论之后,只是为了展示它在LSAdapter存储数据的 chrome 调试器工具中的外观。看看下面的截图。在这里,我重新加载了 2 次应用程序,并按预期创建了两个命名空间。如果每次事物重叠时您都具有相同的命名空间,则会导致一些意外行为。

在此处输入图像描述

于 2013-07-16T10:47:32.043 回答