在 JSF 复合组件中集成 JavaScript,干净的方式

IT技术 javascript jsf integration composite-component
2021-02-07 12:01:27

在 JSF 中,将 JavaScript 集成到复合组件中的“正确”和“干净”方式是什么?我是Unobtrusive JavaScript的粉丝,并将 HTML 与 JS 与 CSS 分开。什么是尽可能少怪癖的好方法?这是我目前最喜欢的:

<composite:interface>
  // ...
</composite:interface>

<composite:implementation>
  // ...
  <script> initSomething('#{cc.clientId}'); </script>
</composite:implementation>    

我不喜欢的是,language A用来生成language B. 事件处理程序和其他东西基本上是一样的。我最喜欢的是通过<insert favorite DOM JavaScript library here>. 这可能吗?您如何进行这种集成?

1个回答

我会说,你所拥有的就是你能得到的最好的,前提是你绝对肯定 HTML 元素的性质是如此独特,以至于你绝对需要每次都通过 ID 选择它。

如果 HTML 表示不是那么独特(我可以想象,Facelets 模板或包含文件可能包含应用程序范围内唯一的 HTML 元素,如页眉、菜单、页脚等,但可以在单个视图中多次重复使用的复合组件?我终生无法想象),那么您也可以考虑使用唯一的类名并对其进行钩子初始化。

例如 /resources/composites/yourComposite.xhtml

<cc:implementation>
    <h:outputScript library="composites" name="yourComposite.js" target="head" />
    <div id="#{cc.clientId}" class="your-composite">
        ...
    </div>
</cc:implementation>

with in /resources/composites/yourComposite.js(假设您使用的是 jQuery)

var $yourComposites = $(".your-composite");
// ...

如有必要,您可以在以下文件中为每个元素提取自动生成的 HTML 元素 ID jQuery.each()

$yourComposites.each(function(index, yourComposite) {
    var id = yourComposite.id;
    // ...
});
感谢您的意见。您是对的,大多数部分都不是唯一的,即使它们是唯一的也无关紧要(即页眉、菜单、页脚)。但是当我通过 AJAX 重新加载或插入组件时,我开始头疼了。我不能也不想重新初始化每个具有特定类名的组件。简单的替代方法是一个唯一的 id,或者设置一些标志来记住哪些组件之前被初始化过。后者需要一些代码,感觉很脏,不是很安全,并增加了一些开销。你是如何解决这种问题的?
2021-03-26 12:01:27