我正在使用Node.js和Express建立一个网站。对于我的视图引擎,我正在使用Vash

在我的应用程序中,我有一个layout.vash文件正在用作我的应用程序的主布局。看起来像这样:

layout.vash

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>@model.title</title>
  </head>
  <body>
    @html.block('content')
  </body>
</html>


然后,我的视图看起来像这样:

view.vash

@html.extend('layout', function(model){
    @html.block('content', function(model){
      <h1>Hello</h1>
    })
})


该视图通过Express引用,路由类似于以下内容:

var router = require('express').Router();
router.get('/', function(req, res) {
    var viewModel = {
      title: 'Hello'
    };

    res.render('view', viewModel);
});


我的viewModel对于每个视图都是唯一的。但是,有些属性在所有视图之间共享。例如,出于开发目的,我想知道请求是否是本地的。如果我使用的是ASP.NET,我知道我会说:

@if (Request.IsLocal) {...}

但是,我不确定如何使用Node和Vash做类似的事情。我的直觉告诉我,我需要以某种方式在我的isLocal后面附加一个名为model的属性。但是,我不确定这是否是正确的主意,或者甚至是可能的。

最佳答案

我使用您在我的个人代码中考虑的方法。

如果要附加到模型的值在多条路线中通用,请考虑使用函数扩展模型:

function appendRouteData(model) {
    model.routes = {};
    model.routes.controller = "SomeController";
    model.routes.action = "index";
    model.routes.parameters = { foo: "bar" };
    return model;
}

...

viewModel = appendRouteData(viewModel);


为了回应您的评论,有多种方法可以在users.js中包含此类功能。

将方法公开为另一个模块并需要它,或者,如果我们疯了,请注入执行相同功能的函数,但这需要一些重构。我预计您只会做一些这种精神错乱...

// routes.js
var UserRoutes = require('./users');
function appendRouteData(controllerName) {
    // some crazy javascript here, might want to contemplate how this actually works first.
    return function (viewModel) {
        viewModel.routes.controller = controllerName;
        return viewModel;
    };
}

module.exports = {
    users: UserRoutes(appendRouteData('users'))
};

// users.js
function UserRoutes(appendRouteData) {
    var router = require('express').Router();
    router.get('/users', function (req, res) {
        var viewModel = {};
        viewModel = appendRouterData(viewModel);
        res.render('users/index', viewModel);
    });
    return router;
}
module.exports = UserRoutes;

关于javascript - Node.js +在渲染 View 之前附加模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32669883/

10-09 08:14