2

引导 ember-data 以填充存储的最佳位置在哪里:

我目前正在使用 ember-data 的第 13 版。

目前我正在 ApplicaitonRoute 中尝试这个:

App.ApplicationRoute = Ember.Route.extend
  setupController: ->
    App.Contact.find().then (contacts) ->
      console.log contacts.get('length')

我发现上面的 console.log 语句将记录 0 但如果我然后键入:

App.Contact.find().get('length')

进入控制台,长度如我所料,即大于0。

我对发生的事情感到困惑,我原以为在记录实现之前不会解决承诺。

我已经浏览了代码,json 在序列化程序中被解析出来,我无法弄清楚为什么第一次长度为 0。

我无法为此创建小提琴,因为它仅在通过其余适配器连接到我们的后端存储时才会发生。

4

2 回答 2

1

引导 ember-data 以填充存储的最佳位置在哪里:

最好的地方是模型钩子(而不是 setupController),因为 ember 路由器将等待每个模型钩子的承诺解决,然后再继续下一个。例如:

App.ApplicationRoute = Ember.Route.extend
  model: ->
    App.Contact.find()

我对发生的事情感到困惑,我原以为在记录实现之前不会解决承诺。

同意这是令人惊讶的。我看看能不能找到重现的方法。您可能会尝试的一件事是在 chrome 开发人员工具中启用 XMLHttpRequests,这样您就可以在 ajax 返回之前查看 promise 是否真的解决了。认为它也可能是一个绑定问题,例如承诺可能在正确的时间解决,但长度属性不会更新到下一个运行循环。

于 2013-05-31T18:08:00.063 回答
1

在 github 上创建问题后,我得到了这个答案:

实际上,DS.Model.find() 返回一个“promistified”RecordArray,当加载recordarray 时,它的promise 被解析(即它的isLoaded 属性为真)。问题是 DS.Model.find() 在创建数组后立即加载,因此承诺被解决。

为了解决您的问题(因为我认为您想返回一个实时数组),这样的事情应该可以工作:

App.Contact.find({}).then(contacts) ->
   return App.Contact.all()

这样,在后台,您调用的是 findQuery,它在后端返回记录时加载,而不是在创建数组时加载

于 2013-05-31T21:08:59.610 回答