【问题标题】:Returning a record with a string in ember在 ember 中返回带有字符串的记录
【发布时间】:2017-06-14 00:28:26
【问题描述】:

我正在尝试实现一个搜索功能,用户可以通过将用户名传递给组件来返回其他用户。我遵循了 ember 指南,并在我的路线文件中有以下代码:

import Ember from 'ember';

export default Ember.Route.extend({
  flashMessages: Ember.inject.service(),
  actions: {
    searchAccount (params) {
      // let accounts = this.get('store').peekAll('account');
      // let account = accounts.filterBy('user_name', params.userName);
      // console.log(account);

      this.get('store').peekAll('account')
      .then((accounts) => {
        return accounts.filterBy('user_name', params.userName);
      })
      .then((account) => {
        console.log(account);
        this.get('flashMessages')
        .success('account retrieved');
      })
      .catch(() => {
        this.get('flashMessages')
        .danger('There was a problem. Please try again.');
      });
    }
  }
});

但是,此代码会引发以下错误:

"You cannot pass '[object Object]' as id to the store's find method"

我认为.find 方法的这种实现不再有效,我需要以不同的方式返回对象。我该怎么做呢?

【问题讨论】:

  • 您说您遵循了 ember 指南,但它在哪里提到使用 find 方法。 find 是一个私有方法,所以不要使用它。

标签: javascript ember.js frameworks ember-data


【解决方案1】:

你不能为filterBy.then

你不能为peekAll.then。因为两者都不会返回 Promise。

searchAccount 内部调用异步代码并返回结果在这里没有多大意义。因为searchAccount 会在异步代码完成之前快速返回。

this.get('store').findAll('account',{reload:true}).then((accounts) =>{
 if(accounts.findBy('user_name', params.userName)){
  // show exists message
 } else {
  //show does not exist message
 }
});

上面的代码会联系服务器,得到所有的结果,然后做findBy进行过滤。所以过滤是在客户端完成的。而不是这个你可以做查询,

this.store.query('account', { filter: { user_name: params.userName } }).then(accounts =>{
 //you can check with length accounts.length>0
 //or you accounts.get('firstObject').get('user_name') === params.userName
 //show success message appropriately.
});

【讨论】:

  • 您的第一个实现最终为我工作,允许我提取我正在寻找的帐户并查询其属性。非常感谢!
【解决方案2】:

DS.Store#find 在现代版本的 Ember Data 中不是有效方法。如果用户已经在商店中,您可以查看和过滤他们:

this.store.peekAll('account').filterBy('user_name', params.userName);

否则,您将需要使用您在之前的问题中使用的相同方法,并 query 他们(假设您的后端支持过滤):

this.store.query('account', { filter: { user_name: params.userName } });

【讨论】:

  • 我尝试实现此代码,但它不断中断并抛出读取 TypeError: this.get(...).peekAll(...).then is not a function at Class.searchAccount 的错误。我可以将两者分开,但运行 filterBy 无法捕获任何数据。您认为导致这些错误的原因是什么,我该如何解决?
  • @d00medman 啊,呃,peekAll 没有返回承诺。我将修复我的示例解决方案。
猜你喜欢
  • 2010-12-22
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多