Ember - findAll和promises

时间:2017-09-13 12:39:31

标签: ember.js ember-data

我在组件中使用findAll有点问题。它涉及到它最终返回的价值。

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

在我的情况下,我想获得第一个对象的名称。所以在我的车把里:

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

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

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

2 个答案:

答案 0 :(得分:0)

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

The branch to deploy, gh_pages, does not exist.

但是,AFAIK,不建议使用promises作为计算属性的值,尽管您仍然可以这样做。在这里,我建议{{#if (await user)}} {{get (await user) 'name'}} {{/if}} Ember.PromiseProxyMixin以及阅读一些(尽管较旧的)论坛帖子(例如documentation)。

答案 1 :(得分:0)

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

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获取用户信息的路线中定义模型挂钩,然后将其传递给子组件,或者如果不同路径上的许多不同组件将其设置在服务上,您将会更容易需要用户信息。