2014-02-28 60 views

回答

1

結帳the guide on redirection

灰燼,您可以通過它的名字過渡到路線或它的URL:

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

編輯:

我不知道的一個很好的方式從外部獲得一個參考路由器您的Ember應用程序,而不是非常氣餒的應用程序。 container .lookup('router:main')。如果你仍然可以在你的Ember應用程序中處理這個UI交互,就像在ApplicationRoute中添加一個動作(動作哈希中的一個方法)一樣簡單。

操縱window.location可能是觸發從Ember應用程序外部轉換的「最乾淨」的方式。

+0

我將如何獲得路由器的引用? – user2765977

+0

嘗試在一個Route內部的'this.transitionTo',和/或Controller內部的this.transitionToRoute(通常在'actions'哈希中的某處)。 – sheldonbaker

+0

即時通訊實際上是一種從控制器/路由之外完成它的方式,即作爲某種外部條件或UI交互的一部分。 – user2765977

2

我有一個混合應用程序,我們運行一些legacy代碼和一個Ember「應用程序」。爲了明確界限,我們創建了一個簡單的庫,我們稱之爲「LegacyBridge」。它有助於外部代碼調用進入Ember,而無需太瞭解內部。這也是一個很好的方法來限制外部代碼可以用你的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現在將回退到哈希)

希望這會有所幫助。

相關問題