将多个商店数据传递给Ember组件

时间:2016-03-19 00:09:45

标签: javascript ember.js ember-data ember-cli

我正在尝试将第二个模型传递给组件。我有几本按类别排序的书。这些类别由Multi-Select-Box选择,我需要将类别(存储在我的数据库中)传递给组件。我不需要改变我只需要一个数组的类别。如果我不想将商店注入组件,我在哪里以及如何请求并传递它们? (没有办法建立多对多关系,书籍只有类别的字符串数组。)

现在我正在尝试这样做:

书籍/ route.js

model() {
  this.store.findAll('book');
}

afterModel() {
  this.set('categories', this.store.findAll('category');
}

书籍/ template.hbs

{{#each books as |book|}}
  {{book-details book=book categories=categories}}
{{/each}}

组件/书细节/ template.hbs

<h2>{{book.title}}</h2>
{{#each categories as |category|}}
  <p>{{category.name}}</p>
{{/each}}

它不适用于这样的类别,所以我需要找到一种方法从商店获取它们并将它们传递给我的组件。

2 个答案:

答案 0 :(得分:1)

如果您没有必要获取类别OnCreate,我建议您考虑使用此方法并删除您的afterModel实现。

afterModel

就个人而言,只有在与相关路线相关联的单个模型(即model() { return { books: this.store.findAll('book'), categories: this.store.findAll('category') } } )时,我才开始定义路线模型。在我有多个适用于给定路线的模型的情况下,我倾向于使用属性。

答案 1 :(得分:0)

更好的方法是使用Ember.RSVP.hash,如下所示:

model: function() {
  return Ember.RSVP.hash({
    books: this.store.findAll('book'),
    categories: this.store.findAll('category')
  });
},

setupController: function(controller, models) {
  controller.setProperties(models);
}

如果服务器的响应延迟,此代码将最正常工作。泰勒的方法有效,但在发现完成之前,过渡到路线太快了。我认为他的方法之所以有用,是因为你使用的是Ember Data,但如果它是一个更通用的Promise,它就无法工作。我希望我能更好地解释,但我自己的理解仍然非常基础。

之后,如果将两个模型都传递给组件,则不应该有任何问题。