Javascript Node.js+;渲染视图前附加到模型

Javascript Node.js+;渲染视图前附加到模型,javascript,node.js,vash,Javascript,Node.js,Vash,我正在使用Node.js和Express构建一个网站。对于我的视图引擎,我正在使用 在我的应用程序中,我有一个layout.vash文件用作我的应用程序的主布局。它看起来像这样: layout.vash <!DOCTYPE html> <html lang="en"> <head> <title>@model.title</title> </head> <body> @html.blo

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

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

layout.vash

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>@model.title</title>
  </head>
  <body>
    @html.block('content')
  </body>
</html>
@html.extend('layout', function(model){
    @html.block('content', function(model){
      <h1>Hello</h1>
    })
})
My
viewModel
对于每个视图都是唯一的。但是,有些属性在所有视图中共享。例如,出于开发目的,我想知道请求是否是本地的。如果我使用ASP.NET,我知道我可以说:


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


但是,我不确定如何使用Node和Vash执行类似的操作。我的直觉告诉我,我需要在我的
模型
中附加一个名为
isLocal
的属性。但是,我不确定这是否正确,或者这是否可能。

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

如果您希望附加到模型中的值在多条路径上是通用的,请考虑使用函数扩展模型:

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;

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

如果您希望附加到模型中的值在多条路径上是通用的,请考虑使用函数扩展模型:

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。(几乎)一切皆有可能。我仍在思考如何用JavaScript做一些事情。假设我有一个名为routes.js的文件。该文件只有以下内容:``module.exports={users:require('./users')};``然后,假设我有一个名为users.js的文件,其中包含我的用户路径的路由。该文件如下所示:
var router=require('express').router();router.get('/users',function(req,res){var viewModel={…};res.render('users/index',viewModel});
我怎样才能a)在routes.js和b中放置
appendRouteData
)从users.js调用appendRouteData?非常感谢。您需要一种向users.js介绍appendRouteData的方法。这可能需要一些重构来正确完成这项工作。由于注释代码格式很糟糕,我将把代码放在我的答案中。另外,它是javascript。(几乎)一切皆有可能。我仍在思考如何用JavaScript做一些事情。假设我有一个名为routes.js的文件。该文件只有以下内容:``module.exports={users:require('./users')};``然后,假设我有一个名为users.js的文件,其中包含我的用户路径的路由。该文件如下所示:
var router=require('express').router();router.get('/users',function(req,res){var viewModel={…};res.render('users/index',viewModel});
我怎样才能a)在routes.js和b中放置
appendRouteData
)从users.js调用appendRouteData?非常感谢。您需要一种向users.js介绍appendRouteData的方法。这可能需要一些重构来正确完成这项工作。由于注释代码格式很糟糕,我将把代码放在我的答案中。