0

这是#35192211的后续版本

我有一个查询参数,比如说'locale'。当用户第一次加载应用程序时,如果他们没有指定 a ?locale=...,那么我想检测一个并立即设置查询参数。(这样,如果他们共享 URL,其他人将准确地看到他们所看到的内容。如果您认为这对于语言环境来说是个坏主意,请想象另一个上下文查询参数,例如account.)

因此,如果用户直接导航到/foo/bar?locale=es,那么他们会留在那里。如果他们导航到/foo/bar,则 URL 立即切换到/foo/bar?locale=en并呈现 foo 页面。

尝试 1

beforeModel(transition) {
  if (transition.queryParams.locale == null) {
    return this.transitionTo({ queryParams: { locale: 'en' } });
  }
}

这无济于事。在转换结束时,URL 没有?locale=en.

尝试 2

beforeModel(transition) {
  if (transition.queryParams.locale == null) {
    this.send('switchLocale', 'en');
  }
},
actions: {
  switchLocale(locale) {
    this.controllerFor('application').set('locale', locale);
    this.refresh();
  }
}

这会引发以下异常:

处理路由时出错:foo.bar 无法触发操作“switchLocale”,因为您的应用尚未完成转换到其第一个路由。要在转换期间触发目标路由上的操作,您可以调用传递给挂钩.send()的对象。Transitionmodel/beforeModel/afterModel

尝试 3

与 (2) 相同,但使用transition.send('switchLocale', 'en').

这可以防止错误,但我们回到它什么也没做。

4

1 回答 1

1

好的,看来我已经满足了这两个要求:

因此,如果用户直接导航到 /foo/bar?locale=es,那么他们就会呆在那里。如果他们导航到 /foo/bar,那么 URL 会立即切换到 /foo/bar?locale=en 并呈现 foo 页面。

基本上我在Ember.run.next使用beforeModel

beforeModel(transition) {
  if (transition.queryParams.locale == null) {
    Ember.run.next(() => transition.send('switchLocale', 'en'));
  }
},

检查工作演示

于 2016-02-05T17:57:46.677 回答