Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用余烬数据缓存随机结果?_Javascript_Ember.js_Ember Data_Ember Components - Fatal编程技术网

Javascript 如何使用余烬数据缓存随机结果?

Javascript 如何使用余烬数据缓存随机结果?,javascript,ember.js,ember-data,ember-components,Javascript,Ember.js,Ember Data,Ember Components,感谢所有阅读本文并提供帮助的人。我将描述什么已经在起作用,然后是我试图达到的目标,我无法理解: 工作原理: 在一个EmberJS组件中,有一个按钮,它用给定的EmberData对象集合中的随机字符串填充文本框。model函数从API中查询所有对象,然后random_search函数从列表中选择一个随机对象并将其插入文本框。到目前为止,代码如下所示: 在component.js中: 在view.hbs中: 我想要的是: 我希望: 为API中的15个随机对象建模查询,并在本地缓存它们,在页面加载之间

感谢所有阅读本文并提供帮助的人。我将描述什么已经在起作用,然后是我试图达到的目标,我无法理解:

工作原理: 在一个EmberJS组件中,有一个按钮,它用给定的EmberData对象集合中的随机字符串填充文本框。model函数从API中查询所有对象,然后random_search函数从列表中选择一个随机对象并将其插入文本框。到目前为止,代码如下所示:

在component.js中:

在view.hbs中:

我想要的是: 我希望:

为API中的15个随机对象建模查询,并在本地缓存它们,在页面加载之间保持。API可能有1000个,如果可能的话,我想在客户端实现这个逻辑。如果这是SQL,查询将类似于从“randomsearchitems”中选择*15 随机搜索选择一个项目,使用它,然后从缓存中丢弃它 一旦所有15个字符串都被使用过一次,我想再次调用API以获得包含15个字符串的新列表 不必强制执行唯一性-如果新对象列表包含上一个列表中存在的对象,则可以
谢谢

我知道这并不是你想要的,但我会让后端随机提供15项,并使用以下代码

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

    return { items: json };
  }
});
然后,在控制器中


我不知道有多少余烬可以给你一个真实的答案,但我会将这15个随机搜索项粘贴到一个属性中,并使用另一个名为current_search的属性,该属性的数字介于0和14之间。每次按下按钮,递增数字1并显示该索引处的值。当您的号码=15时,再执行另一个API调用,将计数器重置回0。没有理由在客户端执行任何随机逻辑。这些都由服务器处理。只是慢慢地计算你的随机结果。尝试在客户端执行随机逻辑只会让您更加困惑。我会让您的随机查询端点成为后端,而不是在前端实现。你想在前端做这件事有什么特别的原因吗?出于人们的原因,我试图让后端尽可能简单,但如果在后端做这件事更有意义的话,我很乐意。缓存是我主要关心的问题:如果可能的话,异步缓存更新也不错;i、 e.使用15个项目中的13个项目后,触发对后端的API调用,并与用户异步,这样,如果后端调用失败,缓存中仍有2个新项目可供使用。我知道这对于所描述的用例来说有点过分了,但是我还有一些其他的用例,我将使用相同的代码。这听起来像是缓存,你只想有这15个项目的两个不同列表。一个列表是所有这些,另一个列表是您“使用”的内容。这可以在控制器、服务或组件上进行,具体取决于使用情况。这非常完美,谢谢:。对于到达此页面的任何其他人,每次使用时,我都会使用didSubmitForm方法重新填充列表,使其最多返回15项,这样它就永远不会为空。
<button onclick={{action "random_search"}}>I'm Feeling Lucky!</button>
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
    }
  }
});