2013-09-16 19 views
1

嘿,我是一個剛剛開始在nodejs上工作的noob。我正在使用compoundjs在nodejs上開發Web應用程序。如何處理compoundjs中不同命名空間的單獨佈局

這是我的視圖文件夾

views/ 
|-- admin 
| |-- games 
| |-- squadplayertypes 
| `-- toursection 
|  |-- tourformats 
|  |-- tourmatchtypes 
|  `-- tours 
|-- layouts 
| |-- admin 
| | `-- toursection 

我創建了一個名稱空間來處理定向到「/ admin」的所有請求的結構。

現在我想知道是否有可以在命名空間「admin」內爲所有路徑定義通用佈局的位置。

這是怎麼了我寫了我的routes.js

admin.namespace('toursection', function(toursection){ 
     toursection.resources('tours',function(tour){ 
      tour.post('fetchTourDetails','tours#fetchTourDetails',{collection:true}); 
     }); 
     toursection.resources('tourmatchtypes'); 
     toursection.resources('tourformats'); 
    }); 
    /*Routes for squad players and all related dependancies*/ 
    admin.resources('squadplayers'); 

回答

3

不幸的是,它看起來並不像有目前的方式(在命名空間面積至少整齊地)做到這一點。在controller-extensions library中搜索佈局,其中控制器的名稱用於搜索佈局,然後在應用程序佈局上默認。

但是,可以在幾個視圖之間定義一個要使用的佈局。您可以使用控制器頂部的layout功能來更改佈局。例如,我可以爲報告名稱空間定義佈局app/views/layouts/reports_layout.ejs

實例命名空間:

map.namespace('reports', function (reports) { 
    reports.resources('billing'); 
}); 

控制器:

layout('reports'); 

action('index', function() { 
    this.title = 'Billing Report'; 
    render(); 
}); 
+0

謝謝@ making3。一種非常乾淨的做我正在努力實現的方式。 – guruwinder

1

好吧,我相信@ making3已經指出了一個標準的方式來做到這一點。雖然可以在應用程序控制器中進行骯髒的黑客攻擊,但如果您確定屬於您的管理部分的網址始終有/admin/,並且此類網址只會加載管理員佈局,您可以按照下面的方法和下面的代碼添加到您的應用程序控制器

before('mylayout', function(){ 
    if(req._parsedUrl.pathname.indexOf('/admin/') != -1) 
     layout('admin/admin'); 
    next(); 
}); 

這增加了一個處理程序,檢查當前的URL沒有查詢參數之前,如果它包含/管理/它會設置佈局的所有控制器使用admin命名空間路由調用的操作。

希望這會有所幫助。

編輯:正確如@guruwinder指出,如果您已將路由配置爲接受參數:參數時尚,則會失敗。所以使用前請注意。

+1

該解決方案適用於大多數情況,但是如果我已經將路由定義爲_/signin /:param/_而不是param,則發送** admin **,那麼您的解決方案將失敗。 – guruwinder

+0

我同意你可以這樣做。如果你對此感興趣,我會建議在控制器庫中實現一種靈活的方法,它可以根據父路徑查找佈局。 '/ admins/toursection'會試圖找到例如admins_layout。 – matth

相關問題