Ember.js 余烬路由器过渡到不';不存在

Ember.js 余烬路由器过渡到不';不存在,ember.js,Ember.js,我有一个问题,我的余烬应用程序,只要登录页面加载一次,我可以登录刚刚好,它带我到正确的页面。然而,当我刷新登录页面,然后登录时,它会将我带到一个奇怪的路由,该路由没有在我的路由器中设置 正确的转换应该是login->authenticated.individual.info 但我要走的路是登录->登录.individual.info 我真的很困惑,到底是什么原因导致路由器将我发送到一条不存在的路由,或者我只是不太熟悉路由器的工作原理 app/router.js Router.map(functi

我有一个问题,我的余烬应用程序,只要登录页面加载一次,我可以登录刚刚好,它带我到正确的页面。然而,当我刷新登录页面,然后登录时,它会将我带到一个奇怪的路由,该路由没有在我的路由器中设置

正确的转换应该是
login
->
authenticated.individual.info

但我要走的路是
登录
->
登录.individual.info

我真的很困惑,到底是什么原因导致路由器将我发送到一条不存在的路由,或者我只是不太熟悉路由器的工作原理

app/router.js

Router.map(function() {
  this.route('authenticated', { path: '/:slug' }, function() {
    this.resource('individual',  { path: 'individual/:id' }, function() {
      this.route('info');
    });
  });
  this.route('login', { path: 'login/:slug' });
});
import Ember from 'ember';
var bind = Ember.run.bind;

export default Ember.Route.extend({
  model: function(params) {
    return {'slug': params.slug};
  },

  actions: {
    login: function(credentials) {
      this.get('session').login(credentials)
        .then(bind(this, 'authenticationDidSucceed'),
              bind(this, 'authenticationDidFail'));
    }
  },

  authenticationDidSucceed: function() {
    var transition = this.get('controller.attemptedTransition');
    var individual_id = this.get('session').individual_id;
    if (transition) {
      transition.retry();
    } else {
      this.transitionTo('individual.info', individual_id);
    }
  },

  authenticationDidFail: function(response) {
    var message = response.responseJSON.error;
    this.set('controller.error', message);
  },

  resetController: function(controller) {
    controller.setProperties({error: null, notice: null});
  }
});
...
<div class='form-group'>
  <button {{action 'login' model}} type='submit' class="btn btn-default form-control">Sign in</button>
</div>
...
slug
本质上是一个与每个用户的成员信息数据相连的个人简称

app/login/route.js

Router.map(function() {
  this.route('authenticated', { path: '/:slug' }, function() {
    this.resource('individual',  { path: 'individual/:id' }, function() {
      this.route('info');
    });
  });
  this.route('login', { path: 'login/:slug' });
});
import Ember from 'ember';
var bind = Ember.run.bind;

export default Ember.Route.extend({
  model: function(params) {
    return {'slug': params.slug};
  },

  actions: {
    login: function(credentials) {
      this.get('session').login(credentials)
        .then(bind(this, 'authenticationDidSucceed'),
              bind(this, 'authenticationDidFail'));
    }
  },

  authenticationDidSucceed: function() {
    var transition = this.get('controller.attemptedTransition');
    var individual_id = this.get('session').individual_id;
    if (transition) {
      transition.retry();
    } else {
      this.transitionTo('individual.info', individual_id);
    }
  },

  authenticationDidFail: function(response) {
    var message = response.responseJSON.error;
    this.set('controller.error', message);
  },

  resetController: function(controller) {
    controller.setProperties({error: null, notice: null});
  }
});
...
<div class='form-group'>
  <button {{action 'login' model}} type='submit' class="btn btn-default form-control">Sign in</button>
</div>
...
app/login/template.hbs

Router.map(function() {
  this.route('authenticated', { path: '/:slug' }, function() {
    this.resource('individual',  { path: 'individual/:id' }, function() {
      this.route('info');
    });
  });
  this.route('login', { path: 'login/:slug' });
});
import Ember from 'ember';
var bind = Ember.run.bind;

export default Ember.Route.extend({
  model: function(params) {
    return {'slug': params.slug};
  },

  actions: {
    login: function(credentials) {
      this.get('session').login(credentials)
        .then(bind(this, 'authenticationDidSucceed'),
              bind(this, 'authenticationDidFail'));
    }
  },

  authenticationDidSucceed: function() {
    var transition = this.get('controller.attemptedTransition');
    var individual_id = this.get('session').individual_id;
    if (transition) {
      transition.retry();
    } else {
      this.transitionTo('individual.info', individual_id);
    }
  },

  authenticationDidFail: function(response) {
    var message = response.responseJSON.error;
    this.set('controller.error', message);
  },

  resetController: function(controller) {
    controller.setProperties({error: null, notice: null});
  }
});
...
<div class='form-group'>
  <button {{action 'login' model}} type='submit' class="btn btn-default form-control">Sign in</button>
</div>
...
。。。
登录
...

在您的
authenticationDidSuccessed
方法中,您需要转换到特定的路由名称
this.transition('authenticated.individual.info')
。与其转换到不同的路由叶,不如说Ember只是在当前叶中查找该路由。

在您的
AuthenticationDidSuccessed
方法中,您需要转换到特定的路由名称
this.transition('authenticated.individual.info')
。与其转换到另一个路由叶,不如说Ember只是在当前叶中查找该路由。

我尝试过,但它出现了以下错误:
未捕获错误:断言失败:未找到经过身份验证的路由。individual.info
Hmm是否尝试将单个路由更改为路由而不是资源?清除名称空间的资源可能会导致一些奇怪的情况。我想我已经知道它是什么了。我想我把路由器弄糊涂了,因为经过身份验证的路由需要一个slug作为参数,而单独的路由需要一个单独的_id作为参数。我刚刚将转换更改为
this.transition('authenticated',this.currentModel.slug)然后我在到达经过身份验证的路由后处理了到单个路由的转换。很高兴您能够找到它!我试过了,它给出了这个错误:
Uncaught error:Assertion失败:找不到经过身份验证的路由.individual.info
Hmm尝试将单个路由更改为路由而不是资源吗?清除名称空间的资源可能会导致一些奇怪的情况。我想我已经知道它是什么了。我想我把路由器弄糊涂了,因为经过身份验证的路由需要一个slug作为参数,而单独的路由需要一个单独的_id作为参数。我刚刚将转换更改为
this.transition('authenticated',this.currentModel.slug)然后我在到达经过身份验证的路由后处理了到单个路由的转换。很高兴您能够找到它!