【发布时间】:2019-05-11 22:44:11
【问题描述】:
感谢阅读本文并提供帮助的人。我将描述什么已经在起作用,然后我想去哪里(我不知道):
工作原理:
在 EmberJS 组件中,有一个按钮可以使用来自给定 EmberData 对象集合的随机字符串填充文本框。 model() 函数从 API 中查询所有对象,然后 random_search() 函数从列表中随机选择一个并将其插入到文本框中。到目前为止的代码如下所示:
在componennt.js:
export default Component.extend({
store: service('store'),
model() {
return this.store.findAll('randomsearchitem').then(function(items) {
return items.map(function(item) {
return {id: item.get('id'), funnnystory: item.get('funnystory')};
})
});
},
actions: {
random_search() {
this.model().then(function(items) {
$('#searchbar-searchtext').val(items[Math.floor(Math.random() * items.length)]['id']);
$('#searchbar-form').submit();
});
}
}
}
在view.hbs:
<button onclick={{action "random_search"}}>I'm Feeling Lucky!</button>
我想要什么: 我想要:
-
model()从 API 查询 15 个随机对象并将它们缓存在本地,在页面加载之间保持不变。 API 可能会有 1000 个列表,如果可能的话,我想在客户端实现这个逻辑。如果这是 SQL,查询将类似于SELECT * FROM 'randomsearchitems' LIMIT 15 -
random_search()选择一项,使用它,然后从缓存中丢弃它 - 一旦所有 15 个字符串都使用过一次,我想再次调用 API 以获得 15 个字符串的新列表
- 不必强制执行唯一性 - 如果新对象列表包含之前列表中存在的对象,那没关系
谢谢
【问题讨论】:
-
我对 Ember 了解的不够多,无法给你一个真正的答案,但我会将这 15 个随机搜索项粘贴到一个属性中,并拥有另一个名为
current_search的属性,它是一个介于 0 和 14 之间的数字. 每按一次按钮,增加数字 1 并显示该索引处的值。当您的数字 = 15 时,再执行一次 API 调用将您的计数器重置回 0。没有理由在客户端执行任何随机逻辑。这一切都由服务器处理。慢慢数数你的随机结果。尝试在客户端中执行随机逻辑只会让您更加困惑。 -
我会让你的随机查询端点成为后端,而不是在前端实现。您想在前端做这件事有什么特别的原因吗?
-
出于人的原因,我试图使后端尽可能简单,但如果放入后端更有意义,我会很好。缓存是我主要关心的问题:)
-
另外,如果可能的话,异步缓存更新会很好;即在使用了 15 个项目中的 13 个之后,触发对后端异步的 API 调用给用户,这样如果后端调用失败,缓存中仍有 2 个新项目可供使用。对于所描述的用例,我知道这有点矫枉过正,但我还有其他几个我将使用相同的代码。
-
这听起来像通过“缓存”你只想拥有这 15 个项目的两个不同列表。一个列表是所有这些,另一个列表是您“使用”的任何内容。这可以在控制器、服务或组件中进行,具体取决于使用情况。
标签: javascript ember.js ember-data ember-components