2014-10-29 43 views
0

我有一個Ember.js,我希望在應用模板(或部分模板)上有一個菜單「bar」。該菜單是通用的,但有一些選項/屬性應該由路由器或控制器控制,例如,某些路由(如登錄)不應顯示「返回」按鈕。在路由器/控制器級別可配置的應用級菜單

我也希望避免在路由器或控制器級別的樣板,但我發現我設計的解決方案並不理想。下面是我所做的:

controllers/application.js: 
showBackButton: function() { 
    var v = this.controllerFor(this.currentRouteName).get('showBackButton'); 

    return (Ember.isEmpty(v) ? true : v); 
}.property() 

而且,因爲模板不會路由變化之間更新:

routes/application.js: 
didTransition: function() { 
    this.controller.propertyDidChange('showBackButton'); 

    return true; 
} 

這讓我在控制器定義了一個新的屬性值,它的工作原理。但我有2個問題:

  1. Ember 1.7顯示了controllerFor方法的棄用警告,我明白新的「需要」功能正在取代,但在這種情況下是什麼替代品!?
  2. 只有最深的控制器才能擁有該屬性,不管怎樣,我應該橫切控制器的層次結構,直到找到它。

有沒有更好的方法,而無需向每個模板/控制器添加代碼或使用基類?

回答

0

也許你可以在路線級別管理它? 由於相關是活動路線,而不是控制器。

I have built an example on jsbin.

我覺得你應該處理的ApplicationController的屬性。您可以使用willTransitiondidTransition掛鉤根據當前控制器設置屬性。其餘的是自定義代碼,取決於你的確切需求。

+0

那麼,這是我最初的,但它需要我把邏輯放在控制器(didTransition),這是我想避免的事情之一。如果邏輯改變,我需要修補每一個用法或代碼。此外,它仍然使用您的示例代碼中的controllerFor實際上可以遷移到使用* needs *屬性。 – 2014-10-29 14:14:38

+0

@AlexandreGomes你擁有路線中的邏輯,而不是控制器!你需要'controllerFor',因爲你沒有'需要'的路線。如果你想要一個單一的代碼,使用混合! – Lux 2014-10-31 12:23:16