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

Javascript 如何在不更改window.location的情况下重定向ember.js中的用户,javascript,ember.js,Javascript,Ember.js,在ember.js(我使用的是1.1.2)中,如何以编程方式将用户“发送/重定向”到特定url(而不强制更改window.location.href)。签出 Ember允许您通过其名称或URL转换到路由: router.transitionTo('post', post) router.transitionTo('/posts/1') 编辑: 除了非常不受欢迎的应用程序之外,我不确定有什么好的方法可以从您的Ember应用程序外部获得对路由器的引用。container.lookup('route

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

签出

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

router.transitionTo('post', post)
router.transitionTo('/posts/1')
编辑:

除了非常不受欢迎的应用程序之外,我不确定有什么好的方法可以从您的Ember应用程序外部获得对路由器的引用。container.lookup('router:main')。如果您仍然可以在Ember应用程序中处理此UI交互,那么只需向ApplicationRoute添加一个操作(操作散列中的一个方法)即可


操纵window.location可能是从您的余烬应用程序外部触发转换的最“干净”的方式。

我有一个混合应用程序,其中我们运行一些
遗留
代码和一个余烬“应用程序”。为了使边界真正明确,我们创建了一个名为“LegacyBridge”的简单库。它有助于外部代码调用到Ember中,而无需了解太多关于内部的信息。这也是一个很好的方式来限制外部代码可以用你的余烬应用程序做什么,因为他们可以做很多事情,保持限制选项是一个好主意

无论如何,以下是您可以做的:

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
};
然后在非余烬代码中的某个地方:

App.LegacyBridge.transitionTo('posts/1');
这当然是令人讨厌的。一般来说,我不会直接从容器中查找内容,但由于它具有良好的封装性,而且这是一个非常特殊的用例,因此我可以接受它

顺便说一句,这比更改URL要好,因为即使您的路由器将位置策略从历史更改为哈希或无,如果rootUrl更改,或者对于不支持pushState的浏览器(Ember现在将回退到哈希),一切都会工作


希望这有帮助

如何获取路由器的引用?尝试
this.transitionTo
在路由内部,和/或
this.transitionToRoute
在控制器内部(通常在
操作
散列的某个地方)。我真正想要的是一种从控制器/路由外部执行的方法,也就是说,作为某种外部条件或用户界面交互的一部分。啊,在这种情况下,问题的关键是获取对路由器的引用。除了非常不受欢迎的
应用程序之外,我不确定从您的余烬应用程序外部执行此操作的好方法。如果您仍然可以在您的Ember应用程序中处理此UI交互,那么只需向您的应用程序路由添加一个操作(在
操作
散列中的一个方法)。想想看,操纵window.location可能是从您的Ember应用程序外部触发转换的“最干净”的方式。