2016-10-14 7 views
2

Мы используем механизм шаблонов marko в приложении nodejs. Мы 3 Marko макетдоступ к переменной глобально в шаблоне marko

  1. header.marko
  2. layout.marko
  3. footer.marko

колонтитулы расположение делают внутри layout.marko

когда-либо мы создаем новая страница marko (страница содержания) мы используем макет marko как это

<layout-use template="./../layout.marko"> 

и Marko нагрузки как этот

this.body = marko.load("./views/home.marko").stream(data); 

Теперь мы хотим получить доступ к переменным во всем мире. i-e, если у нас есть переменная username = 'abc'. мы хотим получить доступ и отобразить это имя в файле заголовка, макета или нижнего колонтитула. Но мы не хотим передавать имя пользователя для каждой страницы со списком контента. i-e, если у нас есть 100 страниц на веб-сайте, мы не хотим передавать имя пользователя для всех 100 страниц. при каждом входе в систему сохранить имя пользователя в глобальной переменной и использовать эту глобальную переменную на всех страницах.

Как мы можем достичь этой глобальной переменной функциональности.

ответ

3

По-видимому, вы можете использовать свойство $global, чтобы выставить данные для всех шаблонов.

Например:

router.get('/test', function *() { 
    this.type = 'html' 
    this.body = marko.load("./views/home.marko") 
    .stream({ 
     color: 'red', 
     $global: { 
     currUser: { id: 2, username: 'hansel' } 
     } 
    }) 
}) 

А затем эти шаблоны:

// home.marko 
<include('./header.marko') /> 
<h1>color is ${data.color}</h1> 

// header.marko 
<h2>Header</h2> 
<p if(out.global.currUser)> 
    Logged in as ${out.global.currUser.username} 
</p> 
<p else> 
    Not logged in 
</p> 

Это работает.

Но, очевидно, вы не хотите, чтобы пройти $global в каждый .stream(), поэтому одна идея состоит в том, чтобы хранить его в контексте Коа, пусть любое промежуточное программное обеспечение присоединять данные к нему, а затем написать помощник, который передает его в шаблон для нас.

// initialize the object early so other middleware can use it 
// and define a helper, this.stream(templatePath, data) that will 
// pass $global in for us 
router.use(function * (next) { 
    this.global = {} 
    this.stream = function (path, data) { 
    data.$global = this.global 
    return marko.load(path).stream(data) 
    } 
    yield next 
}) 

// here is an example of middleware that might load a current user 
// from the database and attach it for all templates to access 
router.use(function * (next) { 
    this.global.currUser = { 
    id: 2, 
    username: 'hansel' 
    } 
    yield next 
}) 

// now in our route we can call the helper we defined, 
// and pass any additional data 
router.get('/test', function *() { 
    this.type = 'html' 
    this.body = this.stream('./views/home.marko', { 
    color: red 
    }) 
}) 

Этот код работает с шаблонами я определил выше: ${out.global.currUser} доступен из header.marko, но ${data.color} доступна из home.marko.

Я никогда не использовал Марко, но я был достаточно любопытен, чтобы прочитать документы, увидев ваш вопрос, так как я думал об использовании его время от времени. Я не чувствовал , так как выяснял, как работает <layout-use>, поэтому вместо этого я использовал <include>.

+1

Спасибо. Его выполнение моего требования. –

+0

отлично, +1 для правильного решения –