2014-04-15 10 views
5

Witam Zastanawiam się, czy istnieje właściwy sposób przekazania zmiennej lub obiektu do widoku układu?SailsJS Właściwym sposobem przekazania obiektu/zmiennej do widoku układu

To jest to, co robię w tej chwili i to działa

index: function(req, res){ 
res.view({ layout: 'mylayout', myvar: 'This is a view var' }); 
} 

Ale w każdym działaniu trzeba zdefiniować „MyVar”, więc można go używać na poziomie układu, więc co chciałbym wiedzieć, czy istnieje jakiś kontroler lub akcja dla układów, więc mogę umieścić tam moją logikę?

Odpowiedz

19

Właściwie począwszy od Żagle v0.10-rc5, możesz użyć skrótu sails.config.views.locals do określenia zmiennych, które powinny być domyślnie dostarczane wszystkie widoki. Więc w config/views.js, coś jak:

{ 
    locals: { 
     myvar : 'this is a view var' 
    } 
} 

by dodać var ​​do każdego widoku. Jest to szczególnie użyteczne w przypadku zmiennych wpływających na mechanizm wyświetlania; Aby uzyskać więcej informacji, zobacz here.

Możesz także użyć policy w Sails v0.10.x, aby ustawić vars pomiędzy wieloma widokami, zmieniając req.options.locals. Więc jeśli stworzył politykę /api/policies/decorate.js z:

module.exports = function(req, res, next) { 

    // Default to an object if empty, or use existing locals that may have 
    // been set elsewhere 
    req.options.locals = req.options.locals || {}; 

    // Set a new local var that will be available to any controller that 
    // implements the policy 
    req.options.locals.myVar = Math.random() 

a następnie skonfigurować /config/policies.js z czymś takim:

module.exports = { 

    '*': 'decorate' 

} 

wtedy wszelkie działania kontroler, który wykorzystuje res.view będą musiały że myVar zmienna dostępna w widoku.

+0

Doskonała !! właśnie tego szukałem, dziękuję! –

+0

Jasna i dobrze napisana odpowiedź. Powinieneś przesłać go do dokumentacji Sails. – dbasch

+0

'req.options.locals' didnt działa dla mnie, ale' res.locals' zrobił. –

2

Zależy od silnika układu, który skonfigurowałeś z żaglami (domyślnie jest to ejs). Jednak przekazywanie zmiennej do widoku jest zwykle wykonywane w następujący sposób:

index: function(req, res){ 
res.view({ layout: 'mylayout', myModel: modelObj }); 
} 

Musisz wstrzykiwać model w każdym widoku, który go używa. Jeśli chcesz zarejestrować model na całym świecie, musisz użyć niestandardowego oprogramowania pośredniego opisanego tutaj: How to create global variables accessible in all views using Express/Node.JS?

+0

Dziękujemy! to powinno wystarczyć :) –

0

Możesz użyć config.views.locals, ale lubię trzymać to poza folderem config i umieścić go w katalogu api/services. Nazywam to api/services/page.js

następnie dodaj pomocników zmiennych i innych widoków, jeśli chcesz.

module.exports = { 
    title:'test', 
    appName: 'My App Name', 
    getBlueprintPath: function (path) { 
    return sails.config.blueprints.prefix + path; 
    }, 
}; 

wtedy moim zdaniem mam

<%= page.appName %> 

Zaletą takiego sposobu jest to twoja logika jest utrzymywany wewnątrz katalogu API. Wciąż można ustawić locals dla widoku i nie przypadkowo zastąpić niektóre zmienne, które wcześniej ustawiłeś w config.views.local.

Powiązane problemy