【问题标题】:Ember - findAll and promisesEmber - findAll 和承诺
【发布时间】:2017-09-13 12:39:30
【问题描述】:

我在组件中使用 findAll 时遇到了一点问题。它涉及到最后返回的值。

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

就我而言,我想获取第一个对象的名称。所以在我的车把上:

users.firstObject.name

'users' 在这种情况下是一个类。但我试图直接返回属性中的第一个对象,如下所示:

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

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

【问题讨论】:

  • 组件默认设置为不知道除了传入的数据之外的数据,而这可以通过导入 store.您应该将 findAll 放在路由器中并将其返回给模型。然后,您可以将该模型传递给组件。从那时起,通过使用 toArray() 来解决承诺的记录实际上非常简单,然后您可以获得数组中的第一个。 this.get('model').toArray()[0]

标签: ember.js ember-data


【解决方案1】:

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

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

然而,AFAIK,不建议使用 Promise 作为计算属性的值,尽管您仍然可以这样做。在这里,我会推荐 documentation for Ember.PromiseProxyMixin 以及阅读一些(虽然较旧)论坛主题(例如 this one)。

【讨论】:

  • 谢谢,我去看看!
【解决方案2】:

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

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 获取用户信息的路由中定义模型挂钩,然后将其传递给子组件或在不同路由上的许多不同组件需要用户信息时将其设置在服务上,您将有更轻松的时间.

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多