Javascript Ember.js将元素添加到集合“中”;“神奇地”;

Javascript Ember.js将元素添加到集合“中”;“神奇地”;,javascript,ember.js,Javascript,Ember.js,问题与: 我有两条路线:randomThingroute和thingsroute 前者显示了一个。。。API中的随机内容(GET/things/random)(有一个按钮“获取另一个随机内容”),后者:显示所有内容:(GET/things) 问题是,每次我点击获取另一个随机物品并显示新物品时,我转到菜谱路线,新显示的随机物品将添加到收藏中 获取随机内容的操作按照相关问题中的建议执行查找(“随机”),并将this.content设置为该值 这里怎么了 编辑: 我使用的是ember数据,我的路线如下

问题与:

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

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

问题是,每次我点击
获取另一个随机物品
并显示新物品时,我转到
菜谱
路线,新显示的随机物品将添加到收藏中

获取随机内容的操作按照相关问题中的建议执行查找(“随机”),并将
this.content
设置为该值

这里怎么了

编辑:

我使用的是
ember数据
,我的路线如下:

App.ThingsRoute = Ember.Route.extend({
  model: function() {
    return App.Thing.find();
  }
});
问题是,每次我点击“获取另一个随机的东西”时,新的东西就会显示出来,我去菜谱路线,这个新显示的随机的东西就会被添加到收藏中

这是预期的行为
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; }
    });
  }
});
请参见下面的工作示例

要了解有关过滤器的更多信息,我建议阅读ember数据集成测试

问题是,每次我点击“获取另一个随机的东西”时,新的东西就会显示出来,我去菜谱路线,这个新显示的随机的东西就会被添加到收藏中

这是预期的行为
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; }
    });
  }
});
请参见下面的工作示例


要了解有关过滤器的更多信息,我建议阅读ember数据集成测试

您是否使用ember数据?如果是这样,您在
/things
路径中的
模型
功能是什么?我相信这是由于身份映射,当获取另一个
App.Thing
时,它会自动添加到
App.Thing.find()
@louiscoquio:question updated您是否在所有返回的数据上设置了
id
属性?理论上,如果从random返回的
id
已在集合中,则不应将其追加到集合中。@Wildhoney:是的,它们只是来自不同的端点:相同的类,相同的id,相同的名称(基本上是所有属性)。您使用的是余烬数据吗?如果是这样,您在
/things
路径中的
模型
功能是什么?我相信这是由于身份映射,当获取另一个
App.Thing
时,它会自动添加到
App.Thing.find()
@louiscoquio:question updated您是否在所有返回的数据上设置了
id
属性?理论上,如果从random返回的
id
已在集合中,则不应将其追加到集合中。@Wildhoney:是的,它们只是来自不同的端点:类相同,id相同,名称相同(基本上所有属性)。谢谢@michael grassotti。你能详细说明一下吗?你所说的“过滤器”是什么意思?当然-更新我的答案以包含一个“过滤器”的示例,我相信问题仍然存在于其他地方:
东西
路线显示所有东西
randomThing
route显示一个随机内容(从后端API获取,其名称与“random”不匹配)。这个随机的东西和所有其他东西是同一个类-为什么余烬将相同的对象推送到集合中(所有“可见”参数,如
id
name
都是相同的)。谢谢@michael grassotti。你能详细说明一下吗?你所说的“过滤器”是什么意思?当然-更新我的答案以包含一个“过滤器”的示例,我相信问题仍然存在于其他地方:
东西
路线显示所有东西
randomThing
route显示一个随机内容(从后端API获取,其名称与“random”不匹配)。这个随机对象与所有其他对象是同一类-为什么余烬将同一对象推送到集合中(所有“可见”参数,如
id
name
都是相同的)。