如何在不更改window.location的情况下重定向ember.js中的用户

时间:2014-02-28 20:49:11

标签: javascript ember.js

在ember.js中(我使用的是1.1.2)如何以编程方式“将用户”发送/重定向到特定的URL(不强行更改window.location.href)。

2 个答案:

答案 0 :(得分:2)

我有一个混合应用程序,我们运行一些legacy代码和一个Ember“app”。为了使边界真正明确,我们创建了一个简单的库,我们称之为'LegacyBridge'。它有助于外部代码调用Ember,而不必过多地了解内部。这也是限制外部代码可以对你的Ember App做什么的好方法,因为他们可以做很多事情,并且保持限制选项是个好主意。

无论如何,这是你能做的:

var transitionTo, getContainer;

var getContainer = function() {
  return App.__container__;
};

var transitionTo = function(route) {
  var router = Ordering.__container__.lookup('router:main');
  router.transitionTo(route);
};

this.App.LegacyBridge = {
  transitionTo: transitionTo
};

然后在非Ember代码的某处:

App.LegacyBridge.transitionTo('posts/1');

这肯定是hacky。一般来说,我不会直接从容器中查找内容,但由于它封装得很好,这是一个特殊的用例,我可以忍受它。

顺便说一下,这比更改URL更好,因为即使您的路由器将位置策略从历史记录更改为hash或none,如果rootUrl更改或者浏览器不支持pushState(Ember现在将回退到hash),一切都会正常工作

希望这会有所帮助。

答案 1 :(得分:1)

查看the guide on redirection

Ember允许您通过其名称或URL来转换到路线:

router.transitionTo('post', post)
router.transitionTo('/posts/1')

编辑:

除了非常气馁的应用程序容器 .lookup('router:main')之外,我不确定从Ember应用程序外部获取对路由器的引用的好方法。如果您仍然可以在Ember应用程序中处理此UI交互,那么就像在ApplicationRoute中添加操作(操作哈希中的方法)一样简单。

操纵window.location可能是触发Ember应用外部转换的“最干净”方式。