Я работаю над проектом, используя Apache Tiles 2.1.
Я столкнулся с проблемой, когда расширение шаблонов с помощью атрибутов списка создает дубликаты этих элементов списка... один набор дубликатов для каждого уровня наследования.
В качестве примера, вот базовое определение и страница, которую оно создаст:
<definition name="base" template="somePage.jsp">
<!-- snip -->
<put-list-attribute name="styles">
<add-attribute value="base.css"/>
</put-list-attribute>
</definition>
Это создаст такой html, как и ожидалось:
<html>
<head>
<!-- snip -->
<link rel="stylesheet" type="text/css" href="../css/base.css"/>
</head>
<body>
<!-- snip-->
</body>
</html>
Если я расширю определение следующим образом:
<definition name="firstExtension" extends="base">
<!-- snip -->
<put-list-attribute name="styles" inherit="true">
<add-attribute value="someOther.css"/>
</put-list-attribute>
</definition>
Опять же, как и ожидалось, я получаю такой результат:
<html>
<head>
<!-- snip -->
<link rel="stylesheet" type="text/css" href="../css/base.css"/>
<link rel="stylesheet" type="text/css" href="../css/someOther.css"/>
</head>
<body>
<!-- snip-->
</body>
</html>
Однако, если я расширяю предыдущий, начинаются проблемы:
<definition name="secondExtension" extends="firstExtension">
<!-- snip -->
<put-list-attribute name="styles" inherit="true">
<add-attribute value="evenMore.css"/>
</put-list-attribute>
</definition>
Это расширение второго уровня производит следующее:
<html>
<head>
<!-- snip -->
<link rel="stylesheet" type="text/css" href="../css/base.css"/>
<link rel="stylesheet" type="text/css" href="../css/base.css"/> <!-- note: duplicate! -->
<link rel="stylesheet" type="text/css" href="../css/someOther.css"/>
<link rel="stylesheet" type="text/css" href="../css/evenMore.css"/>
</head>
<body>
<!-- snip-->
</body>
</html>
«Исходные» атрибуты списков, которые унаследованы, дублируются один раз для каждого расширенного определения, даже если это определение ничего не добавляет к атрибуту списка.
Я стараюсь, чтобы мои определения были очень СУХИМИ, поэтому в некоторых случаях у меня есть 4-5 уровней наследования. Таким образом, «всегда используемые» файлы css дублируются 4-5 раз, даже если только «самое низкое» определение добавляет в список еще один файл css.
Это ошибка в плитках, или я просто использую их не по назначению? Можно ли как-то решить эту проблему, не удаляя просто inherit="true"
? Я бы хотел избежать написания одних и тех же «основных» файлов css и javascript для каждого отдельного определения, если это возможно.