首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >没有Ember数据的AJAX promise

没有Ember数据的AJAX promise
EN

Stack Overflow用户
提问于 2013-03-25 13:45:37
回答 2查看 17.4K关注 0票数 16

我已经决定不使用ember-data,因为它还没有准备好投入生产,而且还在不断变化。我的应用程序只需要发出几个ajax请求,所以应该不会有太大的不同。我在理解如何处理ajax promise响应时遇到了问题。

当我的用户加载应用程序时,他们已经有一个经过身份验证的会话。我正在尝试ping服务器的用户信息,并将其显示在我的模板中。我的模板似乎是在我的ajax请求返回结果之前呈现的,然后没有使用promise进行更新。

代码语言:javascript
复制
// 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;
        });
    }
});

在我的模板中:

代码语言:javascript
复制
<h1> Hey, {{App.currentUser.name_first}}</h1>

如何在收到响应时更新模板,或者延迟渲染,直到收到响应?

EN

回答 2

Stack Overflow用户

发布于 2013-06-13 23:52:56

我会使用Ember.Deferred,而不是像前面提到的那样返回一个空数组。

代码语言:javascript
复制
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;
  }
});

在你的模型钩子中,你所要做的就是

代码语言:javascript
复制
model: function(){
  return App.User.getAllUsers();
}

Ember足够聪明,知道如何处理你返回的promise,一旦它被解决,模型将被正确设置,你也可以返回一个jQuery promise,但它会给你一些奇怪的行为。

票数 6
EN

Stack Overflow用户

发布于 2014-02-05 18:01:16

您也可以将当前用户设置为ApplicationRoute的模型,如下所示:

代码语言:javascript
复制
App.ApplicationRoute = Ember.Route.extend({
    model: function() {
        return App.User.getCurrentUser();
    }
});

因为getCurrentUser()返回一个promise,所以转换将暂停,直到promise要么实现要么拒绝。

这很方便,因为在转换完成时,您的模型已初始化,您将在模板中看到它的呈现。

你可以在Ember指南中使用read up more about async routing

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15608431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档