【问题标题】:How to cache random results using Ember data?如何使用 Ember 数据缓存随机结果?
【发布时间】: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>

我想要什么: 我想要:

  1. model() 从 API 查询 15 个随机对象并将它们缓存在本地,在页面加载之间保持不变。 API 可能会有 1000 个列表,如果可能的话,我想在客户端实现这个逻辑。如果这是 SQL,查询将类似于 SELECT * FROM 'randomsearchitems' LIMIT 15
  2. random_search() 选择一项,使用它,然后从缓存中丢弃它
  3. 一旦所有 15 个字符串都使用过一次,我想再次调用 API 以获得 15 个字符串的新列表
  4. 不必强制执行唯一性 - 如果新对象列表包含之前列表中存在的对象,那没关系

谢谢

【问题讨论】:

  • 我对 Ember 了解的不够多,无法给你一个真正的答案,但我会将这 15 个随机搜索项粘贴到一个属性中,并拥有另一个名为 current_search 的属性,它是一个介于 0 和 14 之间的数字. 每按一次按钮,增加数字 1 并显示该索引处的值。当您的数字 = 15 时,再执行一次 API 调用将您的计数器重置回 0。没有理由在客户端执行任何随机逻辑。这一切都由服务器处理。慢慢数数你的随机结果。尝试在客户端中执行随机逻辑只会让您更加困惑。
  • 我会让你的随机查询端点成为后端,而不是在前端实现。您想在前端做这件事有什么特别的原因吗?
  • 出于人的原因,我试图使后端尽可能简单,但如果放入后端更有意义,我会很好。缓存是我主要关心的问题:)
  • 另外,如果可能的话,异步缓存更新会很好;即在使用了 15 个项目中的 13 个之后,触发对后端异步的 API 调用给用户,这样如果后端调用失败,缓存中仍有 2 个新项目可供使用。对于所描述的用例,我知道这有点矫枉过正,但我​​还有其他几个我将使用相同的代码。
  • 这听起来像通过“缓存”你只想拥有这 15 个项目的两个不同列表。一个列表是所有这些,另一个列表是您“使用”的任何内容。这可以在控制器、服务或组件中进行,具体取决于使用情况。

标签: javascript ember.js ember-data ember-components


【解决方案1】:

我知道这并不完全符合您的要求,但我会让后端提供随机的 15 项,并使用以下代码。

export default Route.extend({
  async model() {
    let response = await fetch('/api/whatever-endpoint');
    let json = await response.json();

    return { items: json };
  }
});

然后,在控制器中

export default Controller.extend({
  searchText: '',

  actions: {
    didSubmitForm() {
      // do something here on submit
      // fetch again? add item to list?
      // depends!
    }
    search() {
      let items = this.model.items;
      let randomId = items[Math.floor(Math.random() * items.length].id

      $('#searchbar-searchtext').val(randomId);
      $('#searchbar-form').submit(); // or call a native function here
    }
  }
});

【讨论】:

  • 这是完美的,谢谢:)。对于访问此页面的其他人,在每次使用时,我都会在 didSubmitForm() 方法中重新填充列表,使其恢复到 15 个项目,使其永远不会为空。
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多