2015-09-19 3 views
1

Я создаю сайт, используя Node.js и Express. Для моего механизма просмотра я использую Vash.Node.js + Добавить к модели перед визуализацией вида

В моем приложении у меня есть файл 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) { ... }

Однако, я не знаю, как сделать что-то подобное с узлом и Vash. Мои инстинкты говорят мне, что мне как-то нужно добавить свойство под названием isLocal к моему model. Однако я не уверен, что это правильная идея, или если это возможно.

ответ

0

Я использую подход, который вы рассматриваете в своем личном коде.

Если значения, которые вы хотите прикрепить к вашей модели являются общими для нескольких маршрутов, рекомендуется использовать функцию, чтобы расширить модель:

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; 
+0

Кроме того, это javascript. (почти) все возможно. – irysius

+0

Я все еще обдумываю * как * делать что-то в JavaScript. Предположим, у меня есть файл, называемый routes.js. Этот файл имеет только это: '' 'module.exports = { пользователей: require ('./ users') }; '' 'Тогда, допустим, у меня есть файл с именем users.js, который имеет маршруты для моих пользовательских путей. Этот файл выглядит так: '' 'var router = require ('express'). Router(); router.get ('/ users', function (req, res) {var viewModel = {...}; res.render ('users/index', viewModel}); '' 'Как я могу добавить a 'appendRouteData 'в routes.js и b) вызвать appendRouteData из users.js? Спасибо! –

+0

Вам понадобится способ введения appendRouteData в users.js. Для корректной работы может потребоваться некоторая рефакторинг. Поскольку форматирование кода комментариев отстой, я положу код в свой ответ. – irysius

Смежные вопросы