我有这样的东西:
App.IndexController = Ember.ObjectController.extend({
results : function(){
return new Ember.RSVP.Promise(function(resolve, reject){
Ember.$.getJSON('/search').then(function(res){
console.log('response data is: ', res);
resolve(res)
})
})
}.property(),
...
})
// data
$.mockjax({
url: '/search',
responseText : {
type: 'different people',
res: [
{name: 'charlie', age: '55'},
{name: 'bobby', age: '19'},
{name: 'raymond', age: '39'}
]
}
})
我如何实际使用返回的数据?目前,results
返回一个 promise ( this.get('results')
),因此我无法在我的 hbs 模板中使用它。我需要将其转换为对象然后返回该对象吗?
最佳答案
回答问题
Ember 内部使用 PromiseProxyMixin神奇地兑现我们所了解和喜爱的 promise 。这是使用 PromiseProxy 进行更新的 JSBin:
http://emberjs.jsbin.com/danazu/edit?html,js,output
您的结果
属性变为:
results: Ember.computed.promise(function(resolve, reject) {
Ember.$.getJSON('/search').then(function(res) {
console.log('response data is: ', res);
return resolve(res);
});
})
但是我不推荐这样做。看看this discourse thread获取一些有关您可能不想这样做的原因的信息。简而言之,处理所有不同状态的 Promise 会很笨重。
寻找更好的方法
路由器是处理 AJAX 请求 promise 的完美场所。一定有某种原因导致您不只是在 model
或 afterModel
Hook 中将这些数据加载到路由器中。您可以创建另一个嵌套资源来表示这些搜索结果,然后链接
该资源吗?
在您的路由器中:
Router.map(function() {
this.resource('search', { path: '/search/:term' });
});
App.PeopleRoute = Ember.Route.extend({
model: function(params) {
return Ember.$.getJSON('/search?term=' + params.term);
}
});
如果这不起作用,至少你可以:
- 当您需要搜索结果时发送
操作
- 在 Controller 中处理 AJAX 请求
- 解析后在 Controller 上设置
结果
。
关于javascript - 使用返回的 promise 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495947/