我已经决定不使用ember-data,因为它还没有准备好投入生产,而且还在不断变化。我的应用程序只需要发出几个ajax请求,所以应该不会有太大的不同。我在理解如何处理ajax promise响应时遇到了问题。
当我的用户加载应用程序时,他们已经有一个经过身份验证的会话。我正在尝试ping服务器的用户信息,并将其显示在我的模板中。我的模板似乎是在我的ajax请求返回结果之前呈现的,然后没有使用promise进行更新。
// route
App.ApplicationRoute = Ember.Route.extend({
setupController: function(){
this.set("currentUser", App.User.getCurrentUser());
}
});
// model
App.User = Ember.Object.extend({
email_address: '',
name_first: '',
name_last: '',
name_full: function() {
return this.get('name_first') + ' ' + this.get('name_last');
}.property('name_first', 'name_last')
});
App.User.reopenClass({
getCurrentUser: function() {
return $.ajax({
url: "/api/get_current_user",
type: "POST",
data: JSON.stringify({})
}).then(function(response) {
return response;
});
}
});
在我的模板中:
<h1> Hey, {{App.currentUser.name_first}}</h1>
如何在收到响应时更新模板,或者延迟渲染,直到收到响应?
发布于 2013-06-13 23:52:56
我会使用Ember.Deferred,而不是像前面提到的那样返回一个空数组。
App.User.reopenClass({
getAllUsers: function() {
var dfd = Ember.Deferred.create();
var users = [];
$.ajax({
url: "/api/get_users",
}).then(function(response) {
response.forEach(function(user){
var model = App.User.create(user);
users.addObject(model);
});
dfd.resolve(users);
});
return dfd;
}
});
在你的模型钩子中,你所要做的就是
model: function(){
return App.User.getAllUsers();
}
Ember足够聪明,知道如何处理你返回的promise,一旦它被解决,模型将被正确设置,你也可以返回一个jQuery promise,但它会给你一些奇怪的行为。
发布于 2014-02-05 18:01:16
您也可以将当前用户设置为ApplicationRoute的模型,如下所示:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return App.User.getCurrentUser();
}
});
因为getCurrentUser()
返回一个promise,所以转换将暂停,直到promise要么实现要么拒绝。
这很方便,因为在转换完成时,您的模型已初始化,您将在模板中看到它的呈现。
你可以在Ember指南中使用read up more about async routing。
https://stackoverflow.com/questions/15608431
复制相似问题