在ember.js中(我使用的是1.1.2)如何以编程方式“将用户”发送/重定向到特定的URL(不强行更改window.location.href)。
答案 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)
Ember允许您通过其名称或URL来转换到路线:
router.transitionTo('post', post)
router.transitionTo('/posts/1')
编辑:
除了非常气馁的应用程序容器 .lookup('router:main')之外,我不确定从Ember应用程序外部获取对路由器的引用的好方法。如果您仍然可以在Ember应用程序中处理此UI交互,那么就像在ApplicationRoute中添加操作(操作哈希中的方法)一样简单。
操纵window.location可能是触发Ember应用外部转换的“最干净”方式。