1

最新の JsInterop を使用して JavaScript から gwt メソッドを呼び出そうとしています - 以下は私の html の head 部分です

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<!--                                                               -->
<!-- Consider inlining CSS to reduce the number of requested files -->
<!--                                                               -->
<link type="text/css" rel="stylesheet" href="Home.css">

<!--                                           -->
<!-- Any title is fine                         -->
<!--                                           -->
<title>Web Application Starter Project</title>

<!--                                           -->
<!-- This script loads your compiled module.   -->
<!-- If you add any GWT meta tags, they must   -->
<!-- be added before this line.                -->
<!--                                           -->
<script type="text/javascript" language="javascript"    src="Home/Home.nocache.js"></script>

</head>

以下は私のhtmlの本体部分です

<body onload="myFunction()">

<script >
function myFunction(){
    alert("something to say");
    var foo = new host.Employee();
    foo.hello("Gautam");
}
</script>

<!-- RECOMMENDED if your web app will not function without JavaScript  enabled -->

<h1>Web Application Starter Project</h1>

<table align="center">
  <tr>
    <td colspan="2" style="font-weight:bold;">Please enter your name:</td>
  </tr>
  <tr>
    <td id="nameFieldContainer"></td>
    <td id="sendButtonContainer"></td>
    <td id="someButton"><input type="button" value="SomeValue"  onclick=myFunction()/></td>
  </tr>
  <tr>
    <td colspan="2" style="color:red;" id="errorLabelContainer"></td>
  </tr>
</table>
</body>

ここにJavaクラスがあります

import com.google.gwt.user.client.Window;

import jsinterop.annotations.JsMethod;
import jsinterop.annotations.JsType;

@JsType(namespace = "host" , name = "Employee" )
public class Employee implements Serializable {

private String name ;
private int age ;
private long salary ;

@JsMethod(name = "hello")
public String sayHello(String name){
    String last = "Hello " + name ;  
    Window.alert(last);
    return last ;
}
}

ブラウザでは、本文 onload=myFunction() が呼び出され、最初のアラートが常に表示されます。

ただし、ボタン someValue をクリックすると myFunction からの最初のアラートが表示されますが、予想される host.Employee() は常に未定義を表示します

Home.html:47 Uncaught ReferenceError: host is not defined

ここで何が問題なのか教えていただけますか?

2.8.0-beta1 用の gwt-maven-plugin でビルドしています。

更新 - ここに私の pom コンテンツ 4.0.0 があります

  <parent>
    <artifactId>bi-parent-client</artifactId>
    <groupId>com.pa.bi</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.pa.bi</groupId>
  <artifactId>bi-gwt-host</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Maven Archetype for GWT</name>
<properties>
<!-- Convenience property to set the GWT version -->
<gwtVersion>2.8.0-beta1</gwtVersion>

<!-- GWT needs at least java 1.7 -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
<dependencies>
  <dependency>
    <groupId>com.google.gwt</groupId>
    <artifactId>gwt</artifactId>
    <version>${gwtVersion}</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
  <groupId>com.google.gwt</groupId>
  <artifactId>gwt-servlet</artifactId>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>com.google.gwt</groupId>
  <artifactId>gwt-user</artifactId>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>com.google.gwt</groupId>
  <artifactId>gwt-dev</artifactId>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
</dependencies>

<build>
<!-- Output classes directly into the webapp, so that IDEs and "mvn process- classes" update them in DevMode -->
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>

<plugins>

  <!-- Mojo's Maven Plugin for GWT -->
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>gwt-maven-plugin</artifactId>
    <version>2.8.0-beta1</version>
    <executions>
      <execution>
        <goals>
          <goal>compile</goal>
          <goal>test</goal>
          <goal>generateAsync</goal>
        </goals>
      </execution>
    </executions>
    <!-- Plugin configuration. There are many available options, see 
      gwt-maven-plugin documentation at codehaus.org -->
    <configuration>
      <runTarget>Home.html</runTarget>
      <modules>
        <module>com.pa.bi.gwt.host.Home</module>
      </modules>
      <copyWebapp>true</copyWebapp>
    </configuration>
  </plugin>
</plugins>
</build>
</project>

私は追加しました

<add-linker name="xsiframe" />
<set-configuration-property name="devModeRedirectEnabled"
    value="true" />

私の Home.gwt.xml モジュール ファイルに。しかし、まだ運がありません

アップデート -

jsInterOpMode フラグを削除して追加

<generateJsInteropExports>true</generateJsInteropExports>

そして私のmaven gwt:run は奇妙なエラーをスローします -

[ERROR] Unable to find 'JS_RC.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source?

通常、モジュールを継承する必要があることを意味し、github の gwt プロジェクトでそのようなモジュールを探しましたが、今のところ運がありません。

4

1 に答える 1

3

-generateJsInteropExportsこれは、 SDM で使用する場合の GWT 2.8.0-beta1 の既知の問題です。修正済みですが、まだリリースされていません: https://github.com/gwtproject/gwt/issues/9223

GWT 2.8.0-SNAPSHOT を使用してみてください。

于 2016-01-10T14:23:58.257 に答える