Например, я создал несколько пользовательских компонентов пользовательского интерфейса, некоторые зависят от jquery-min.js
, некоторые зависят от jQuery UI
, некоторые зависят от jsTree
, некоторые зависят от Dojo
и т. Д.
Я могу импортировать необходимые библиотеки в каждом файле xhtml:
file1.xhtml
<script src="jquery-min.js"></script>
<script src="jquery-ui.js"></script>
<script src="jsTree.js"></script>
<my:tree> ... </my:tree>
file2.xhtml
<script src="jquery-min.js"></script>
<script src="jquery-ui.js"></script>
<script src="jquery-ui-dialog.js"></script>
<script src="jquery-ui-autocompletion.js"></script>
<my:autodialog> ... </my:autodialog>
file3.xhtml
<script src="jquery-min.js"></script>
<script src="dojo.js"></script>
<my:dojostuff> ... </my:dojostuff>
Это очень неудобно, я должен знать, какой компонент зависит от какой библиотеки, и зависимости от зависимостей.
Дляразмещение всех зависимостей в файле шаблона, безусловно, упростит задачу, но это приведет к загрузке слишком большого количества сценариев и памяти в мобильном телефоне.
Итак, существует ли что-то вроде «UIAutoOrganizedScriptsComponent»?
Должен ли я использовать что-то вроде хэш-набора в области запроса, который содержит зависимости, заполненные компонентами, используемыми в текущем запросе, например, вот так?
static ThreadLocal<HashSet> requestScopedDependencies;
static Map<String, URL> libraryURLs;
MyTreeComponent extends UIOutput {
// ...
dependencies = requestScopeDependencies.get();
dependencies.add("jstree");
}
Или, может быть, мне следует поискать компонентДОМ, чтобы узнать, где я могу ввести ?вот так:
MyTreeComponent extends UIOutput {
// ...
UIComponent scriptsContainer = getParent().getParent().getChildren()[2].getChildren()[3];
// search if scriptsContainer already included the script...
if (! included) {
scriptsContainer.addElement("<script>...");
}
}
Ну очень неуклюжий.Есть какое-нибудь элегантное решение для этого?