【问题标题】:Ember.js: Pathless Transitional RouteEmber.js:无路径的过渡路线
【发布时间】:2013-10-29 15:53:49
【问题描述】:

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。

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

【问题讨论】:

    标签: javascript ajax ember.js


    【解决方案1】:

    你会想要利用 mixin,并连接到转换路由。

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

    Ember Client Side Authentication, route authentication

    【讨论】:

    • 我不明白这如何解决我的问题,即用户有多种登录方式(通过注册、登录或 cookie,每种方式都会触发不同类型的对 api.php 的 AJAX 请求。)我需要一些可以传递 jqXHR 或承诺的东西,让它调用 LoadingRoute,然后在 jqXHR/promise 完成后做出路由重定向决定。
    • 但是 +1 因为我不知道这个功能,它会派上用场。
    【解决方案2】:

    最后,我通过将以下代码添加到 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() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多