Поддерживает ли Play Framework «фрагменты»? - PullRequest
8 голосов
/ 25 января 2011

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

Он будет содержать как код шаблона, так и внутренний контроллер (аналогично «фрагментам» в инфраструктуре LiftWeb).

Я знаю, что есть модуль меню для Play, но яМеня больше интересует, как это будет достигаться в целом.

1 Ответ

11 голосов
/ 25 января 2011

Есть два способа включить общий код представления в Play Framework.

Вы можете использовать тег #{include} или тег #{extends}.

Тег extends, как следует из названия, выходит из родительского представления. Тег extends используется по умолчанию в коде скелета, установленном Play при создании нового приложения. Это расширяет main.html. Вы добавляете здесь свой код.

Тег include позволяет вам вводить общий фрагмент кода в ваши шаблоны в указанной точке. Это работает во многом так же, как php include / require или jsp включает работу.

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

Простой пример использования renderArgs:

@Before
private static void commonData() {
    // do your logic here
    renderArgs.put("menu", menu);
    renderArgs.put("selected", selectedMenuItem);
}

значения, которые вы поместили в renderArgs (меню и выбрано в примере), будут доступны точно так же, как если бы вы передавали их в метод render.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...