2014-02-23 51 views
3

我有一個超級控制器:ApplicationController這產生了我的區域:頁眉/頁腳。當我配置的路線之一嘗試屈服於另一個模板上的另一個區域時,父控制器的yieldTemplates將被覆蓋。使用鐵路路由器從超級控制器繼承良率模板

例子:

ApplicationController = RouteController.extend({ 
    yieldTemplates: { 
     'footer': { to: 'footer' }, 
     'header': {to: 'header'} 
    } 
}); 

var SignUpController = ApplicationController.extend({ 
    template: 'signUp' 

}); 

Router.map(function() { 


    this.route('signup', { 
     path: '/sign-up', 
     controller: SignUpController, 
     template: 'signUp-form', 
     disableProgress: true, 
     yieldTemplates: { 
      'personal-signup': {to: 'signup-detail'} 
     } 
    }); 
}); 

任何想法,爲什麼繼承是不是在這種情況下工作?

回答

3

我有一個類似的問題,在這裏讀到了答案:https://github.com/EventedMind/iron-router/issues/249#issuecomment-27177558

發生了什麼事是你的路由器的配置水平則重寫RouteController原型。通常,選項會覆蓋鐵路由器中的原型屬性。

一個簡單的解決方案是創建與主產生全局對象,然後延長,當新收益率是必要的每個控制器對該對象:

var mainYieldTemplates = { 
    'footer': { to: 'footer' }, 
    'header': {to: 'header'} 
}; 

ApplicationController = RouteController.extend({ 
    yieldTemplates: mainYieldTemplates 
}); 

var SignUpController = ApplicationController.extend({ 
    template: 'signUp', 
    yieldTemplates: _.extend({}, mainYieldTemplates, { 
      'personal-signup': {to: 'signup-detail'} 
     } 
    ) 
}); 

Router.map(function() { 
    this.route('signup', { 
     path: '/sign-up', 
     controller: SignUpController, 
     template: 'signUp-form', 
     disableProgress: true, 
    }); 
}); 

還有一個在你的代碼中的次要矛盾,你在控制器中聲明「template」屬性爲「signUp」,但在路由本身中將其設置爲「signUp-form」。這將覆蓋控制器上的「模板」屬性。您可以改爲使用所有路線的屬性爲每條路線創建一個新控制器,而不是覆蓋它們。

+0

這可以用'數據'屬性來完成 – Warz

+0

我喜歡這種方法,但有一個變化和一個警告:不是定義一個'mainYieldTemplates'全局對象(並且沒有什麼錯誤),我想過提到'_.extend'中的'SignUpController'' __super__'原型,但不起作用。我可以用'ApplicationController.yieldTemplates'替換'mainYieldTemplates',但不能'SignUpController .__ super __。yieldTemplates'。任何想法爲什麼?請注意'SignUpController .__ super __。data.call(this)'在'data'方法中工作正常,所以我不知道爲什麼它在'yieldTemplates'屬性中不起作用。 – fulv

2

我厭倦了在其他答案中使用該解決方案,結果monkeypatching RouteController表現得如我所料在這種情況下。迄今爲止效果很好。創建您自己的任何RouteControllers之前的地方,代碼

(function(){ 
    var orig = RouteController.extend; 
    RouteController.extend = function(newChild) { 
    var extendedTemplates = {}; 
    if (!newChild.yieldTemplates) { 
     newChild.yieldTemplates = {}; 
    } 
    _.extend(extendedTemplates, this.prototype.yieldTemplates); 
    _.extend(extendedTemplates, newChild.yieldTemplates); 
    newChild.yieldTemplates = extendedTemplates; 
    return orig.apply(this, arguments); 
    } 
})(); 

投擲。從此處擴展的任何其他控制器將延伸到父項的yieldTemplates字段。