2014-01-07 6 views
7

Ich benutze SailsJS, um eine Web-App zu entwickeln. Meine App ist ähnlich wie andere, die ein separates Frontend und Admin-Layout haben.Wie benutzt man mehrere Layouts in einer SailsJS App?

Ich benutze Standard-Ansichts-Engine 'ejs'. Kannst du mir bitte helfen, ein separates Layout für Frontend und Admin-Site zu verwenden? Kann ich für jede Aktion ein bestimmtes Layout verwenden?

Vielen Dank,

Anh Nguyen

Antwort

3

Von Sails.js Documentation:

Mindestens in EJS, statt Ihrer benutzerdefinierten Layout mit dem Layout lokalen anzeigt, müssen Sie _layoutFile verwenden:

res.view({ 
    _layoutFile: 'relativePathToYourCustomLayoutFromTheTargetView.ejs' 
}); 

Der Pfad zu dem Layout, das Sie verwenden möchten, sollte relativ zur Ansicht angegeben werden, die Sie rendern. Also, wenn Sie in der erstellen Aktion des Usercontroller sind, macht einen Blick (Blick/user/create.ejs), könnte der relative Pfad zu Ihrem benutzerdefinierten Layout sein: ../staticSiteLayout.ejs

PROJECT FOLDER 
└── views 
    ├── staticSiteLayout.ejs 
    ├── layout.ejs 
    └── user 
     └── create.ejs 

UPDATE:

scheint, wie die Dokumentation ein bisschen weg von dem Code ist, so für die aktuelle (v0.9.8) Version der Art und Weise folgendes zu gehen:

module.exports = { 
    index: function(req, res){ 
    res.view({ layout: 'layoutadmin' }); 
    } 
} 
+0

Ich versuche, dies scheint aber wie es funktioniert nicht. Dies ist mein Code: 'module.exports = { \t Index: function (req, res) { \t \t res.view ({ \t \t _layoutFile:‘ ../layoutadmin.ejs' \t \t}); \t} } ' – anhnt

+0

Was ist der Fehler, den Sie haben? – bredikhin

+0

Es rendert immer das Standardlayout, das ich in config/views.js definiert habe. – anhnt

3

In Sails 0,10 Sie ein anderes Layout wie folgt einstellen in deinem Controller:

// override the layout to use another 
    res.locals.layout = 'layouts/layout2'; 
    return res.view('test'); 

Detaillierte Erklärung here.

0

Entschuldigung für das Spammen Ihrer Frage, aber ich brauche eine ähnliche Lösung für meine App. Es wäre wunderbar, Layouts in routes.js zu definieren, also würde zum Beispiel/admin/* ein Layout verwenden, und z./app/* würde das andere verwenden, usw. Weil es ein Pita ist, tauchen Sie in die Controller ein und überlagern Sie sie mit statischen Layoutpfaden. Ich habe versucht, dieses Konzept, aber es scheint nur zu arbeiten, wenn ich einen Controller in den routes.js Konfigurationsdatei zB auch definieren:

module.exports.routes = { 

    '/admin/*' : { 
     controller: 'AdminController', 
     action: 'index', 
     locals: { 
     layout: 'admin/layout' 
     } 
    } 
}; 

Dies funktioniert, aber routet alle Aktionen für den Admin in den gleichen Controller Das ist natürlich falsch. Wenn ich den Controller Teil weglassen, wird das Konzept mit immer die Standardansicht/layout.ejs und die lokale ist nicht gesetzt:

module.exports.routes = { 

    '/admin/*' : { 
     locals: { 
     layout: 'admin/layout' 
     } 
    } 
}; 

Dies funktioniert nicht, aber es wäre ideal, es auf diese Weise zu erhalten.

0

Wenn Sie Ansicht UND Layout in Ihrem Controller einstellen müssen (Sails v0.11):

res.view('auth/login', { layout: null }); 

Layout:

null = Keine

'Ordner/layout' = Ihr Layout

+0

es funktioniert nicht – shuboy2014

2

In Sails v0.12, wenn Sie das Layout festlegen müssen in Mit Ihrem Controller können Sie einen neuen Ordner erstellen (zB "Layout") und Layoutdateien verschieben.

res.view('auth/login', {layout: layout/my_file_layout} 

können Sie auch tun:

res.locals.layout = "layout/my_file_layout"; 
res.view('auth/login');