What is the proper way to integrate dynamic content into the layout.ejs file in a Sails.JS application?

后端 未结 2 1499
礼貌的吻别
礼貌的吻别 2020-12-20 14:27

Say I wrote a blog app in Sails.js.

On every page in this app, there is a sidebar widget called \"Recent Posts\", where it lists the titles of the 5 most re

相关标签:
2条回答
  • 2020-12-20 15:11

    I found out another way to do this. What I did was to create a service that could render .ejs files to plain html by simply taking advantage of the ejs library already in sails. This service could either be invoked by the controller, or even passed as a function in the locals, and executed from within the .ejs. The service called TopNavBarService would look like:

    var ejs = require('ejs');
    exports.render = function() {
        /* database finds goes here */
        var userInfo = {
            'username' : 'Kallehopp',
            'real_name' : 'Kalle Hoppson'
        };
        var html = null;
        ejs.renderFile('./views/topNavBar.ejs', {'locals':userInfo}, function(err, result) { html = result; });
        return html;
    }
    

    In the constroller it could look like:

    module.exports = {
        testAction: function (req, res) {
            return res.view('testView', {
                renderNavbar: TopNavBarService.render // service function as a local!
            });
        }
    };
    

    This way you can create your customized ejs-helper that could even take arguments (although not shown here). When invoked, the helper could access the database and render a part of the html.

    <div>
        <%- renderNavbar() %>
    </div>
    
    0 讨论(0)
  • 2020-12-20 15:17

    In folder /config you should create a file express.js and add something like that:

    module.exports.express = {
        customMiddleware: function(app){
            app.use(function(req, res, next){
                // or whatever query you need
                Posts.find().limit(5).exec(function(err, posts){
                    res.locals.recentPosts = posts;
                    // remember about next()
                    next();
                });
            });
        }
    }
    

    Then just make some simple loop in your view:

    <% for(var i=0; i<recentPosts.length; i++) { %>
        <% recentPosts[i].title %>
    <% } %>
    

    Here are some links to proper places in documentation: https://github.com/balderdashy/sails-docs/blob/0.9/reference/Configuration.md#express and https://github.com/balderdashy/sails-docs/blob/0.9/reference/Response.md#reslocals

    0 讨论(0)
提交回复
热议问题