Обработка событий в макете Гобелена

У меня есть проблема в моем проекте гобелена.

Каждый раз, когда я загружаю одну страницу, он запускает метод onActivate, если он определен на рассматриваемой странице. Но я не знаю, как поймать это событие в моем шаблоне макета.

Если я определю переменную в layout.java, например:

@Property
String a = "foo";

И я выбираю значение этой переменной в шаблоне (layout.tml):

<p>${a}</p>

Хорошо, это напечатает "foo" в HTML всех страниц, которые используют этот макет, но если я хочу менять это значение каждый раз, когда страница перезагружается, например, определяя onActivate в layout.java.

void onActivate(){
    a="bar";
}

Этот метод не запускается в layout.java, только на дочерних страницах, когда он определен. (В дочерние страницы я включаю макет, как говорит Натан Q) Как я могу обновить значение переменной?

Есть идеи?

2 ответа

Решение

Хорошо, я нашел способ обновить значение моей собственности. И это было очень просто:

Вместо того, чтобы объявлять свойство и обновлять это значение в методе onActivate, я объявляю открытый метод в layout.java для получения этого значения и внесения изменений в него.

private String a = "foo";

public String getA(){

    a = "bar";
    return a;
}

Таким образом, я могу вносить любые изменения в переменную каждый раз, когда загружается страница.

Я думаю, что макет является компонентом в этом случае. Только страницы имеют контекст активации, поэтому onActivate() не запускается.

Я не знаю вашего точного варианта использования, но:


Если это переменная, относящаяся к странице, тогда вы можете просто передать параметр вашему компоненту Layout.

Layout.java

@Parameter
@Property
private String a;

SomePage.tml

<html t:a="someString" t:type="Layout" ... />

SomePage.java

@Property
private String someString;

...

void onActivate() {
   someString = "something specific for this page";
}

ИЛИ ЖЕ

Если эта переменная должна быть установлена ​​при каждом рендеринге, а не для конкретной страницы, вы можете просто использовать событие SetupRender вашего компонента Layout.

void setupRender() {
   a = ...;
}
Другие вопросы по тегам