【问题标题】:Need ember model to return array promise not object需要 ember 模型返回数组承诺而不是对象
【发布时间】:2015-06-14 11:31:04
【问题描述】:

我正在尝试向我的模型返回一个数组承诺,以便我可以遍历我的模板中的结果。我需要联系产品作为承诺数组而不是承诺对象返回。

型号:

App.ContactEditorRoute = Ember.Route.extend({
   model: function (params) {
    return Ember.RSVP.hash({
        contact: this.store.find('contact', params.id),
    /*need this to return array not an object which is currently does*/
        contactproducts: this.store.find('contactproduct',params.id),
        products: this.store.find('product') 
    })
}

模板:(使用标志进行标记)

each contactproduct in contactproducts
      p
        ' quantity
        contactproduct.quantity
        ' notes
        contactproduct.note

【问题讨论】:

  • 您正在按 id 搜索,当您指定资源 id 时它不会返回集合。为什么它需要是一个集合?
  • 我需要能够遍历结果。每个联系人都有 0 到多个存储在联系人产品中的产品
  • 如果联系人产品是联系人中的 hasMany,为什么要在 rsvp 哈希中获取它?它应该是联系模型的一部分...

标签: javascript arrays ember.js ember-data emblem.js


【解决方案1】:

如果您真的希望它是一个具有当前代码结构方式的数组,那么您可以这样做

contactproducts: this.store.find('contactproduct',params.id)
    .then(product => [product])

当您想对find 的结果进行一些额外处理时,可以采用这种方法,但仍要像model 设计的那样返回一个promise。

但是,正如另一位海报所指出的那样,这可能不是您想要做的。如果联系人产品是联系人的hasMany 属性,那么它们已经存在(或者可能基于{async: true} 为您获取)。

如果联系人没有hasMany('contactproduct'),那么您可能需要自己获取它们,但我怀疑联系人产品是否与联系人具有相同的 id。如果他们这样做,他们不应该这样做。模型 ID 应该是唯一的。假设联系产品有一个belongsTo 指向contact,那么你想这样做:

contactproducts: this.store.find('contactproduct', { contact: params.id })

返回一个(承诺)一个数组。

但是,一般在这种情况下,最好将额外的检索放在afterModel 挂钩中。这样可以让您的model 保持整洁。

【讨论】:

  • 谢谢。我正在寻找 contactproducts: this.store.find('contactproduct', { contact: params.id }) 的语法。数据设计将 contactproducts 提取到单独的表中,因为每个联系人与产品的关系都有一个数量属性。
  • @KyleSnell 旁注,您似乎在使用代理控制器 (ObjectController),因为您在模板中引用了 contactproducts 而不是 model.contactproducts。这是不推荐使用的行为,显式版本更易于维护。
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 2019-08-11
  • 2021-01-13
  • 2017-01-03
  • 2021-01-11
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多