2016-12-15 42 views
0

我对GXT(以及GWT/GWTP)非常陌生。我想知道当包含面板的模态对话框显示时(如果对话框最初未显示,并且仅在单击按钮时出现),我是否可以延迟加载GXT(4.0)[自定义]小部件。懒惰初始化/加载一个GXT小部件,当它的父类变得可见

我想要这种行为的原因是,这个小部件需要加载一个小程序HTML代码,当页面最初实例化所有其他字段小部件/面板/对话框时,该代码不可用。因此,我需要延迟从另一个应用程序获取小程序代码,直到明确出现对话框。

这可能吗?

+0

是,延迟加载是可能的。例如IFrameElement有一个LoadHandler事件。其他小部件也会有可以标记的事件。 – WLGfx

+0

你能再细说一下吗? – NuCradle

回答

0

加载到GWT框架(IFrameElement)中的图像和URL的延迟加载。使用LoadHandler事件加载图像/ URL后,您可以捕获事件。

private void loadLoginPage() { 
    final Frame frame = new Frame(url_base + url_login); // set the frames url 
    frame.addLoadHandler(new LoadHandler() { 
     @Override 
     public void onLoad(LoadEvent event) { 
      // Get the document from the loaded frame (similar to RootPanel on main page) 
      Document doc = IFrameElement.as(frame.getElement()).getContentDocument(); 

      // From here you can wrap widgets in the frame like this 

      final TextBox username = TextBox.wrap(doc.getElementById("username")); // from the html doc using id="username" 

      // grab a div element 

      DivElement div = DivElement.as(doc.getElementById("mydiv")); 

      // Create content to be added to the doc 

      ButtonElement button_elem = doc.createPushButtonElement(); 
      Button button = Button.wrap(button_elem); 

      // attach to the document 

      div.appendChild(button.getElement()); 
     } 
    }); 
    // Attach to DOM 
    RootPanel.get("mything").add(frame); 
} 

和类似的图像加载。

Image image = new Image(image_url); 
image.addLoadHandler(new LoadHandler() { 
    @Override 
    public void onLoad(LoadEvent event) { 
     // image is ready to be used. 
    } 
}); 
// attach to DOM to initiate loading of the image 

希望这有助于...

+0

不幸的是,这并不是他们所要求的 - iframe会在连接时开始加载,即使您没有附加它,图像也会立即开始加载(并且如果它在加载之前完成加载,你永远不会得到称为...的处理程序)。写作的问题是要求一种延迟的方式,直到父母是_visible_,并且可能在许多方面不可见,同时仍然被附着。 –

+0

@ColinAlworth你是对的。我对UI很陌生,一些基本概念很难理解,特别是在这方面,初学者没有太多的GXT资源。我试图让我的widget(扩展'Html')来实现GXT的'LoadHandler'(不是GWT's),并用'addHandler(这个,类型为<...>)'在它的构造函数中注册这个小部件。然后,当对话即将显示时,在演示者中用'LoadEvent'调用'fireEvent()',但小部件中'onLoad(LoadEvent <...>)'的实现永远不会被调用。我在错误的道路上? – NuCradle

+0

GWT'LoadEvent'的意思是“这个小部件的DOM元素导致了一个本地LOAD事件”,而GXT'LoadEvent '表示这个加载器的'M'类型的数据已经可用,从配置'C'“ 。这也不是你想要的。相反,您可能需要查看'AttachEvent'(然后在完成时移除处理程序),或者观察对话框的ShowEvent,每次在屏幕上显示对话框时都会触发(也可以考虑'BeforeShowEvent',它允许你改变主意而不显示它)。 –