【问题标题】:ember-data findAll returns 0 records on first requestember-data findAll 在第一次请求时返回 0 条记录
【发布时间】:2013-06-01 05:08:59
【问题描述】:

引导 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。

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

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我有一个问题 - 真的很奇怪。为什么它只在我传入一个空对象时才起作用。如果您只是执行 App.Contact.find() - 它会在实际完成其 ajax 请求之前调用 promise 函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多