Ember - findAll 和 promises

Ember - findAll and promises

我在组件中使用 findAll 时遇到一点问题。它关系到最后 returns 的值。

users: Ember.computed(function() {
return this.get('store').findAll('user');
}),

在我的例子中,我想获取第一个对象的名称。所以在我的把手中:

users.firstObject.name

'users' 在这种情况下是 class。但是我正在尝试 return 直接 属性 中的第一个对象,像这样:

user: Ember.computed(function() {
    return this.get('store').findAll('user')
    .then(function(user){
      return user.get('firstObject');
    });
  }),

但在这种情况下,在我的把手中,user.name 是未定义的,用户是一个承诺。有一些我无法理解的承诺,它们是如何工作的...... 有人可以帮助我在不对我的用户使用 'firstObject' 的情况下获得正确的用户吗? 提前致谢 !

解决您问题的最快捷方式是安装一个 ember-promise-helpers 插件并将其应用到您的模板中,如下所示:

{{#if (await user)}}
  {{get (await user) 'name'}}
{{/if}}

但是,据我所知,不建议使用 promises 作为计算属性的值,尽管您仍然可以这样做。在这里我会推荐 documentation for Ember.PromiseProxyMixin as well as reading some (although older) forum threads (for instance this one).

我认为您遇到的问题不在于承诺,而是您如何使用计算 属性。

findRecord/findAll 的最佳位置是路线中的模型挂钩。最好不要依赖 firstObject 来描述您所描述的内容。当您的应用程序的后端数据发生变化时,您无法保证哪条记录最先出现。

计算属性实际上是为了观察其他数据并更新关于该数据的显示信息,而不是为了自己从商店中获取东西。他们需要的参数是他们应该监视更新的数据的名称。由于您计算的 属性 没有观察任何东西,它永远不会触发。这是一个例子。

  firstName: null,
  lastName: null,

  fullName: Ember.computed('firstName', 'lastName', function() {
    let firstName = this.get('firstName');
    let lastName = this.get('lastName');

    return `${firstName} ${lastName}`;
  })

您可以在指南的 Computed Properties 下阅读更多内容。

如果您在使用 findRecord 获取用户信息的路由中定义一个模型挂钩,然后将其传递给子组件或将其设置在服务上(如果不同路由上的许多不同组件需要用户信息。