2015-04-16 1 views
0

Моя цель - динамически создавать меню навигации на веб-сайте Meteor.Как визуализировать шаблоны в одном регионе с помощью Iron Router (Meteor)

У меня есть классическое меню со статическими ссылками и выход, где я хочу другие ссылки, которые будут вставлены, когда необходимо:

<nav id="menu"> 
    <a href="#link1">Link 1</a> 
    <a href="#link2">Link 2</a> 

    {{> yield "navLinks"}} 
</nav> 

-

// module_posts.js 
Router.onAfterAction(function(){ 
    if (userIsAdmin()) { 
     this.render('postsMenu', { to: 'navLinks' }); 
    } 
}); 

// module_users.js 
Router.onAfterAction(function(){ 
    if (userIsAdmin()) { 
     this.render('usersMenu', { to: 'navLinks' }); 
    } 
}); 

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

Возможно, я делаю это неправильно, поэтому, пожалуйста, дайте мне чистое решение.

- EDIT -

Хорошо, может быть, лучшее объяснение: У меня есть несколько модулей (сообщения, пользователи, роли и т.д.), которые могут быть включены или выключены, каждый из них имеет чтобы управлять им.

Теперь я хочу отобразить их меню в одной уникальной области с именем {{nav}}. Поэтому мне нужно будет написать код где-нибудь в каждом модуле, чтобы добавить свое меню в область {{nav}}, если модуль включен.

Я действительно хочу использовать шаблоны для этого, потому что я мог бы создавать логику непосредственно в них, а не использовать коллекции для хранения ссылок.

+0

Взгляните на [это] (https://www.discovermeteor.com/blog/spacebars-secrets-exploring-meteor-new-templating-engine/). Это может дать вам некоторое представление. – thepanuto

+0

Прежде чем дать ответ, мне интересно, хотите ли вы, чтобы эти «навигационные ссылки» были добавлены в список ссылок навигации после того, как пользователь перешел на определенную страницу, или вы хотите, чтобы все они были добавлены сразу же в приложение нагрузить? Добавление их динамически и вообще при загрузке приложения определит решение, которое вам требуется для этой проблемы. – n4tiv3pwnst4r

+0

@ n4tiv3pwnst4r: Я хочу отображать сообщения, когда, например, URL-адрес совпадает **/admin/posts/***, я не хочу видеть их в любое время, только когда они мне понадобятся. –

ответ

0

Причина, по которой вы видите проблему, вызванную тем, что вы используете функцию Router.onAfterAction() для визуализации ваших шаблонов меню. Проблема заключается в том, что функция Router.onAfterAction() применяется глобально ко всем маршрутам и запускается всякий раз, когда запускается новый маршрут. Вот почему вы видите только ссылки навигации из окончательного определения определений навигационных ссылок, которое в случае вашего вопроса было бы ссылкой на usersMenu. Вместо этого вы хотите определить логику отображения шаблона меню навигации для каждого маршрута, по которому вы хотите, чтобы он отличался. Кроме того, вы не хотите использовать функцию onAfterAction(), потому что она предназначена для последующей обработки после того, как ваш маршрут действительно запущен. Для того, чтобы достичь того, чего вы хотели, вы могли бы сделать следующее:

Router.route('/admin/posts', { 
    ... 
    yieldRegions: { 
     'postsMenu': {to: 'navLinks'} 
    } 
    ... 
}); 

Router.route('/admin/users', { 
    ... 
    yieldRegions: { 
     'usersMenu': {to: 'navLinks'} 
    } 
    ... 
}); 

Итак, как вы можете видеть, мы определили определение маршрута для каждого из ваших уникальных маршрутов, как указано в вашем вопросе, один для администратора сообщений и один для пользователей admin. Чтобы указать конкретные шаблоны, которые будут отображаться в названии yield s для данного маршрута, вы должны использовать опцию маршрута yieldRegions. В нем вы указываете имя каждого шаблона, который вы хотите отобразить, в область имен named yield. Здесь вы указываете свои шаблоны из своего вопроса.

Если вы хотите ознакомиться со всеми параметрами маршрута, которые доступны при определении определения маршрута, пожалуйста, посмотрите here.

+0

Спасибо, но на самом деле он не разрешает мою проблему, я имею в виду, да, соответствующее меню отображается на правой странице. НО, Дело в том, что я не могу добавить другие ссылки на {{navLinks}} после того, как сделал это, как это сделать? ** Я говорил о модулях, у каждого модуля есть свои собственные ссылки, поэтому они должны иметь возможность отображать ссылки на один и тот же регион {{navLinks}}. ** –