Обработка событий в макете Гобелена
У меня есть проблема в моем проекте гобелена.
Каждый раз, когда я загружаю одну страницу, он запускает метод 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 = ...;
}