【问题标题】:integrating GWT and angular2集成 GWT 和 angular2
【发布时间】:2017-10-08 18:57:26
【问题描述】:

我在 GWT 中有一个大项目,我正在尝试将 Angular2 与它集成。 (angular2-gwt 不是一个选项,因为我在 2.7 版上运行并且当时无法迁移到 2.8)

我面临着一些我似乎不知道如何面对的问题:

1) 我听说您可以使用 JSNI 来使用 Angular 应用程序,但我似乎无法做到这一点,也无法找到有关它的任何信息。它是如何工作的,我能用它做什么? (调用函数是一个选项?)

2) 我尝试将 Angular 应用程序的选择器标记添加到 GWT 入口点 html,效果很好,但是当我尝试将选择器添加到 .ui.xml 文件(UI 绑定)时,它没有不工作,为什么?

3) 是否有从 servlet 调用 GWT 客户端的选项?我的意思是我在 angular2 应用程序中并使用休息调用,这个休息调用可以在 GWT 客户端调用某些东西吗?

谢谢!

【问题讨论】:

  • 关于 1):我们有一个 AngularJS 应用程序,它必须使用内部 iframe。在iframe 中,我们可以像这样访问父Angular 应用程序$scopewindow.parent.angular.element(window.frameElement).scope();。由于 GWT 也在 iframe 中运行,因此您可以将其转换为 JSNI 代码以使用 GWT 中的 Angular 应用程序。

标签: javascript java angular gwt


【解决方案1】:

首先,我应该指出,从 GWT 2.7 迁移到 GWT 2.8 对我来说非常轻松。我更新了我的应用程序并且没有遇到任何重大问题(一些 Maven 依赖项发生了变化,一些标志在这里和那里等)。 我之所以提到这一点,是因为 GWT 2.8 与 GWT 2.7 相比,原生 JS 支持得到了极大的改进,所以如果可能的话,你真的应该进行切换。

无论如何,在 GWT 2.7 中:

  1. 您可以像这样从 GWT 调用任何类型的 JS:

public static native void sayHello() /*-{ $wnd.alert("Hello world!"); }-*/;

注意 $wnd 构造,它是 JS 中“全局”命名空间的占位符(即在 JS 中,您只需调用 alert() 而不使用特定的命名空间)。

但是请注意,如果您要与 大量 JS 原生代码交互(例如使用 Angular 中的复杂对象),您将为此付出高昂的代价。当你想从 JS 调用一个或两个函数时,这条路线很适合,但除此之外我不推荐它。 例如,您可以在http://www.gwtopenlayers.org/ 上查看gwt-openlayers 的源代码,看看它对于更复杂的示例是什么样子的(这个库包含了很多原生 JS)

  1. 我真的不知道任何角度,但.ui.xml 是一个特殊的野兽。在后台发生了一些混淆/发生了其他一些事情。最接近 HTML 的方法是将一些内容放入 g:HTMLPanel 小部件中,但据我所知,您不能真正将 JS 放入其中。
  2. 您在这里问的内容有点混乱。除非您坚持,否则您不能轻易地从服务器端 servlet 调用任何客户端代码;然后,您可以采取变通办法并使用长轮询等技术,但我不是这些技术的忠实拥护者。我可以就这个主题展开更多讨论,但我对您的观点的理解似乎有所欠缺。

【讨论】:

  • 首先,感谢您的评论。其次,我熟悉原生 JS,但我的问题是如何从 JSNI 调用角度函数/成员。另外,我猜你对 HTMLPanel 中的 javascript 的看法是正确的,因为它不起作用。
  • 对不起,在这种情况下,也许我误解了一些事情。是不是已经可以从 JSNI 调用 Angular 函数/成员,就像您对任何其他本机 JS 所做的那样?是什么阻止你这样做,错误是什么?我能想到的是,也许你没有使用$wnd/$doc 命名空间并试图直接访问东西(即你调用alert() 而不是$wnd.alert())解决这个问题的最简单方法是显示一个角度代码在本机 JS 中的调用,以及您如何尝试通过 GWT 完成相同的事情,以及您遇到的错误是什么。
猜你喜欢
  • 2010-09-23
  • 2011-06-10
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多