0

ember.js 的新手。我要做的是:创建一个没有路径的过渡路线,当我过渡到它时,我可以将 AJAX 承诺作为模型传递给它,然后一旦承诺完成,它就会做出重定向决定。我希望在发生这种情况时调用 LoadingRoute 视图。我试图通过以下路线实现这一目标:

App.LoginUserRoute = Ember.Route.extend({
    setupController: function(controller, model) {
        //Model should be a promise
        model.then(this.success.bind(this),this.failure.bind(this));
    },

    success: function (data) {
        if (data.success) {
            App.loggedInUser = App.User.create(data);
            console.log(App.loggedInUser);
            //Make redirection decision
        }
        else {
            alert(data.error);
        }
    },

    failure: function () {
        //Failure code
    }
});

但是,当我尝试将承诺传递给如下路线时:

var request = $.post("api.php", {action: 'create_user', username: this.username, password: this.password});
this.transitionToRoute('loginUser',request);

我收到错误“传递的上下文对象多于路由的动态段:loginUser”,因为我正在尝试创建无路径路由,而 Ember 要求在使用 transitionToRoute() 传递时将模型序列化到路径中。

我需要这个的原因是:

  • 登录事件可以从多个控制器发生(当用户注册时,当他们使用登录屏幕登录时,或者当检测到正确的 cookie 时首次加载应用程序时),我不想在所有这些控制器中复制登录逻辑.
  • 登录完成后,根据返回的用户对象的性质,可以将用户定向到多个不同的路由。
  • 我希望在请求完成时调用 LoadingRoute。

我认为我的问题的解决方案不是使用路由,而是使用其他东西。但是,我不确定“其他东西”会是什么。

4

2 回答 2

1

您需要利用 mixin 并连接到过渡路线。

以下 SO 答案将满足您的所有需求:

Ember 客户端身份验证、路由身份验证

于 2013-10-29T17:46:53.313 回答
0

最后,我通过将以下代码添加到 ApplicationController 来实现我想要做的事情

loginUser: function (request) {
    this.transitionToRoute('loading');
    request.then(this.loginRequestSuccess.bind(this),this.loginRequestFailure.bind(this));
},

loginRequestSuccess: function (data) {
    if (data.success) {
        App.loggedInUser = App.User.create(data.user);
        console.log(App.loggedInUser);
        //Route transition decision
    }
    else {
        alert(data.error);
    }
},

loginRequestFailure: function () {
    //Failure code
}

然后使用 jqXHR 对象从代码中发出登录请求的任何位置调用 loginUser() 函数。

于 2013-10-29T18:55:07.803 回答