【发布时间】:2016-02-04 17:08:57
【问题描述】:
我正在为我们公司的 JSF 门户研究一个新的前端框架,并且正在考虑使用 Angular2。我想逐步将页面上的特定组件从 JSF 迁移到 Angular2 / REST。我不想使用 Angular2 进行路由,至少现在还不想,而且我不希望 Angular 完全接管页面:在可预见的将来,某些组件仍然需要 JSF。
理想情况下,我会用我的 Angular 根组件包装我的 JSF 模板正文的内容,并将 JSF 呈现的 HTML 投影到根组件中,以便 JSF 像以前一样工作,并且模板中的任何 Angular 组件都是拿起,都可以交流。例如:
<h:body>
<my-app>
<h:panelGroup styleClass="languageSwitcher">
<h:form>
<h:selectOneMenu value="#{languageHandler.language}" onchange="submit()">
<f:selectItem itemValue="en" itemLabel="English" />
<f:selectItem itemValue="nl" itemLabel="Dutch" />
</h:selectOneMenu>
</h:form>
</h:panelGroup>
<my-angular-component data-source="/rest/mydata"></my-angular-component>
</my-app>
<h:body>
对于 Angular 1,我会使用嵌入来完成这项工作。但是,据我了解,Angular 2 content projection does not work on the root component,因为渲染的 HTML 不被视为 Angular 编译视图。
我也考虑过使用根组件的templateURL 来动态获取 JSF 呈现的页面,但这很难实现,并且不能很好地与 JSF 所做的众多 POST 配合使用。
我能想到的唯一方法是为每个 Angular 组件创建一个根组件来替换一些 JSF,并在每个页面上引导我使用的所有组件。这里的缺点是我需要大量的样板代码来引导我构建的每个 Angular 组件,而且它们没有共享的根组件,因此它们之间的通信受到限制。此外,我需要通过属性配置每个 Angular 组件,但是作为这些 aren't picked up automatically either,我需要向每个组件添加自定义代码以获取它们:
class MyAngularComponent {
constructor(public elementRef: ElementRef) {
this.dataSourceUrl = this.elementRef.nativeElement.getAttribute("data-source");
}
}
然后当我最终用 Angular 替换整个前端时,我必须再次重构每个组件以使用 @Input,而不是手动从属性中检索信息。
有人知道更好的方法吗?还是 JSF 和 Angular2 不能很好地混合?
【问题讨论】:
-
“或者 JSF 和 Angular2 不能很好地混合?” 如果这是真的,angularfaces.com 将永远不会存在。
-
AFAIK angularfaces 使用 AngularJS(又名 Angular 1),它支持嵌入,大大简化了过程。
-
如果 Angular 1 能满足您的需求,为什么要使用 2?
-
我没有说 Angular 1 符合我的需求。它支持嵌入,这很有帮助,但正如我们在上一个项目中发现的那样,它还有其他缺点。
-
我们最终决定使用 Aurelia 代替 Angular。除此之外,它比 Angular 更好地支持这种场景。
标签: jsf typescript angular