Ember:在控制器中使用异步数据

时间:2014-08-18 23:39:55

标签: asynchronous ember.js

我在Ember控制器@authSession.currentUser.clients中进行了异步调用。然后过滤此请求的结果以填充下拉菜单。

 filterClientsBy: (term) ->
   filter = new RegExp("^#{term}", 'i')
   @authSession.currentUser.clients.filter (client) ->
     filter.test(client.displayName)

问题是过滤器第一次没有工作,因为它不会等待客户端从服务器返回。我觉得我在这里错过了关于Ember的一些基本信息。看起来客户端是ModelArray。我能否以某种方式将此视为承诺?有没有办法在渲染模板之前将这些数据引导到控制器中?

1 个答案:

答案 0 :(得分:0)

好的,所以你可以在这里做几件事。

因为那里存在异步调用,所以需要使用promise来等待客户关系返回。 (假设您已经" async"在您的模型中设置客户关系)

这给你留下了几个选项(我在javascript中做了这些选项并将它们转换为coffeescript,所以看起来有点奇怪):

1)从" filterClientsBy"返回一个Promise像这样:

filterClientsBy: (term) ->
    self = this
    filter = new RegExp("^" + term, "i")
    new Ember.RSVP.Promise((resolve, reject) ->
      self.authSession.currentUser.clients.then (clients) ->
      filteredList = clients.filter((client) ->
         filter.test client.displayName
      )
      resolve filteredList
      return
    return
)

2)您可以在控制器上创建一个名为" filteredClients"你设置在已解决的"客户"上面的承诺阻止(而不是返回承诺)。

filterClientsBy: (term) ->
  self = this
  filter = new RegExp("^" + term, "i")
  self.authSession.currentUser.clients.then (clients) ->
    filteredList = clients.filter((client) ->
      filter.test client.displayName
    )
    self.set "filteredClients", filteredList
    return

  return