我在Ember控制器@authSession.currentUser.clients
中进行了异步调用。然后过滤此请求的结果以填充下拉菜单。
filterClientsBy: (term) ->
filter = new RegExp("^#{term}", 'i')
@authSession.currentUser.clients.filter (client) ->
filter.test(client.displayName)
问题是过滤器第一次没有工作,因为它不会等待客户端从服务器返回。我觉得我在这里错过了关于Ember的一些基本信息。看起来客户端是ModelArray
。我能否以某种方式将此视为承诺?有没有办法在渲染模板之前将这些数据引导到控制器中?
答案 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