【问题标题】:Accessing a model collection in controller - Ember2.5在控制器中访问模型集合 - Ember2.5
【发布时间】:2016-06-18 16:55:02
【问题描述】:

在控制器上创建计算属性时尝试访问控制器模型时,出现以下错误:

model.uniqBy is not a function

app/controller/ticket.js

export default Ember.Controller.extend({
  statuses: Ember.computed('model', function() {
      var model = this.get('model');
      return model
              .uniqBy('status')
              .map(function(i) { return i.status; })
              .toArray();
  }),
});

我提供给控制器的模型是从this.store.findAll('ticket'); 返回的集合,但尝试迭代它似乎会导致上述错误。给模型的集合不应该是 Ember.Enumerable 对象吗?我是否应该尝试通过 DS.Store 访问集合(在这种情况下,我不明白需要将模型传递给控制器​​)​​?

【问题讨论】:

  • 你想得到什么?存储在工单集合中的状态字段的唯一值数组?
  • 你应该使用 2.7 早期版本,在 ember 2.7 中引入了 uniqBy 宏。 emberjs.com/blog/2016/06/08/…
  • @kumkanillam 我知道该宏,它已记录在案但尚未实现,并计划在 2.7 中提供,该版本处于测试阶段。不过,我更喜欢继续使用稳定版本,并在这个问题的帮助下找到了答案。谢谢!

标签: ember.js ember-model ember-controllers


【解决方案1】:

Ember.computed.uniqBy

一个计算属性,它返回一个包含数组中所有唯一元素的新数组,唯一性由特定键确定

请为您的计算属性尝试此操作

statuses: Ember.computed.uniqBy('model', 'status')

编辑

如果需要,您可以在此属性上使用 ember 计算映射来微调您的数组,例如像这样

status: Ember.computed.map('statuses', function(status, index)
  return status.toUpperCase() + '!';
})

另一种方法是计算属性使用此处描述的动态聚合语法

https://guides.emberjs.com/v2.6.0/object-model/computed-properties-and-aggregate-data/

所以 Ember.computed('model.@each.status', function()

希望对你有帮助

【讨论】:

  • 谢谢,但这会返回一个对象数组,我需要返回一个字符串数组(例如 ['done', 'waiting'])而且我不认为问题是 ember 计算的,这可能是我阅读模型的方式?如果它是票的集合,那么我确定我应该能够在其上调用 Ember.Enumerable 方法,但似乎并非如此
  • 为什么不创建另一个依赖于状态的计算属性并使用映射函数呢?所以 statusesAsStrings: Ember.computed('statuses', function()....等在这里你不需要过滤它们,因为它们已经通过独特的状态获利
  • 因为我不需要:P
  • 不知道你的意思。如果你有两个属性,它会更干净。您可以像开始一样执行此操作,但您的计算属性不能依赖于模型。您需要做的是依赖每个模型项,例如 Ember.computed('model.@each.status'...希望它有所帮助
  • 啊,'@each' 选择器!这正是我想要的,谢谢:)。如果您愿意,可以更新答案以使用它,我会接受并关闭
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多