2012-10-10 64 views
3

我试图让我的脚与GWT湿看,如果迁移将工作。我通常首先尝试更难的部分,以确保我可以完成项目。我的项目中最困难的部分是引用第三方JS库。在这个例子中,我试图使用PubNub,尽可能多的我们的平台使用它。如何将第三方JavaScript库包含在可重用的gwt库/控件中?

我想要做的是创建一个可用于需要PubNub的其他GWT项目的可重用对象。我有一个简单的小测试成功运行(即,我已经掌握了JNSI的基础知识),但我的问题是 - >我在哪里放置对第三方脚本的引用以正确创建库/模块?

现在我只是把外部脚本的引用放到了项目的HTML页面中,但我很确定从可重用性角度来看这是不正确的,因为这个lib将被用在其他项目中,每个项目会有他们自己的基本HTML页面。

我试图把在gwt.xml文件的引用,但这似乎失去引用(即我的测试项目将不再有效,因为它没有当脚本是在HTML页面)

你有有关如何将第三方库包含在可重用GWT库/小部件中的任何提示?

+0

请看看这个问题:http://stackoverflow.com/questions/12746303/gwt-library-with-external-javascript-script –

+0

感谢Jean。我可以得到一个关于如何完成这个任务的示例代码片段。我遵循了帖子中给出的内容,似乎并不奏效。 – user1733647

+0

类似的方法:http://stackoverflow.com/a/8764304/921244 –

回答

4

这里有一个使用客户端软件包和脚本注入器的示例,可以使用同步加载或异步加载。

当使用同步时,外部js内容将被嵌入到应用程序中,否则它将被包含在不同的片段中,这将得到一个ajax请求。

你可以把你的API放在任何服务器上,并用ScriptInjector加载它。

public class Example { 

    public static interface MyApiJs extends ClientBundle { 
    MyApiJs INSTANCE = GWT.create(MyApiJs.class); 

    @Source("my_api.js") 
    TextResource sync(); 

    @Source("my_api.js") // Should be in the same domain or configure CORS 
    ExternalTextResource async(); 
    } 

    public void loadSync() { 
    String js = MyApiJs.INSTANCE.sync().getText(); 
    ScriptInjector.fromString(js).inject(); 
    } 

    public void loadAsync() throws ResourceException { 
    MyApiJs.INSTANCE.async().getText(new ResourceCallback<TextResource>() { 
     public void onSuccess(TextResource r) { 
     String js = r.getText(); 
     ScriptInjector.fromString(js).inject(); 
     } 
     public void onError(ResourceException e) { 
     } 
    }); 
    } 

    public void loadFromExternalUrl() { 
    ScriptInjector.fromUrl("http://.../my_api.js").inject(); 
    } 
} 

将帖子

更好的办法是在gwtquery 1.4.0命名JsniBundle使用的新功能。我们在旧金山和法兰克福的GWT.create会议期间推出了此功能。

通过这种方法,您可以将任何外部JavaScript(放置在源树中或托管在外部主机中)作为JSNI块插入。它有很多好处:

  • 利用GWT jsni验证器,混淆器和优化器。
  • 当应用程序不使用它时,摆脱任何jsni java方法。

语法其实很简单:

public interface JQueryBundle extends JsniBundle { 
    @LibrarySource("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") 
    public void initJQuery(); 
} 

JQueryBundle jQuery = GWT.create(JQueryBundle.class); 
jQuery.initJQuery(); 
相关问题