Ember.js将元素添加到“神奇地”收集

时间:2013-01-31 10:41:56

标签: javascript ember.js

问题与Ember.js: retrieve random element from a collection

有关

我有两条路线:randomThing路线和things路线。

前者从API(GET /things/random)显示一个随机的东西(有一个“获取另一个随机的东西”的按钮),后者:显示所有内容:(GET /things

问题在于,当我点击Get another random thing并且显示新事物并且我转到recipes路线时,每次都会将这个新显示的随机内容添加到集合中...

获取随机内容的操作会按相关问题中的建议执行find("random"),并将this.content设置为此值。

这里有什么问题?

修改

我正在使用ember-data,我的路线是这样的:

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

1 个答案:

答案 0 :(得分:1)

  

问题在于,当我点击获取另一个随机的东西并且显示新的东西时,我会去配方路线这个新显示的随机物品被添加到集合......

这是预期的行为。 App.Thing.find()不会简单地查询api并返回结果。相反,find()返回一个包含ember知道的所有东西的数组。它包括过去调用find()返回的对象,通过App.Thing.createRecord()创建的客户端对象,当然还有通过App.Thing.find('random')查询的单个对象。返回此数组后,find()并启动另一个API调用,如果返回其他记录,则将它们推送到数组上。

  

这里有什么问题?

这听起来不像是有什么不对的。如果你想防止随机事物出现在ThingsRoute中,你需要将该路线的模型改为过滤器,而不是仅仅返回每一件事。例如:

App.ThingsRoute = Ember.Route.extend({
  model: function() {
    //Kick off query to fetch records from the server (async)
    App.Thing.find();

    //Return only non-random posts by applying a client-side filter to the posts array
    return App.Thing.filter(function(hash) {
      if (!hash.get('name').match(/random/)) { return true; }
    });
  }
});

有关工作示例,请参阅此jsbin

要详细了解过滤器,建议您阅读ember-data store-model-filter集成测试