Node.js + 在渲染视图之前附加到模型
Node.js + Append to model before rendering a view
我正在使用 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;
我正在使用 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;