为啥异步服务不填写复选框表单面板?

Posted

技术标签:

【中文标题】为啥异步服务不填写复选框表单面板?【英文标题】:Why async service dont fill check-box form panel?为什么异步服务不填写复选框表单面板? 【发布时间】:2017-08-31 12:37:58 【问题描述】:

我正在开发一个 GWT 应用程序,当用户单击按钮时,应该会出现带有复选框的表单面板。这些复选框应填写来自异步服务的项目列表。但是当我打开表单面板时,我没有这些复选框。我调试并看到我的服务结果没有按时出现,但后来的列表已满.. 代码如下:

     @Override
        public void createBody() 


            GWT_ACCESS_ROLE_SERVICE.findByUserId(null, currentSession.getSelectedAccount().getId(), userId, new AsyncCallback<PagingLoadResult<GwtAccessRole>>() 

                @Override
                public void onFailure(Throwable caught) 
                    // TODO Auto-generated method stub

                

                @Override
                public void onSuccess(PagingLoadResult<GwtAccessRole> result) 
                  lista   = result.getData();
                    for (GwtAccessRole gwtAccessRole : lista) 
                     bb = new CheckBox();
                        bb.setBoxLabel(gwtAccessRole.getRoleName());
                    
                    FormPanel roleFormPanel = new FormPanel(FORM_LABEL_WIDTH);
                    roleFormPanel.add(bb);

                    bodyPanel.add(roleFormPanel);

                
            );

        

我做错了什么,为什么我的复选框没有填写?提前致谢。

编辑:当我调试时,这个方法 GWT_ACCESS_ROLE_SERVICE.findByUserId 在表单面板出现之后显示。所以表单面板出现了,然后调试到我的方法并完成所有工作。

【问题讨论】:

你说的是复选框,但我只看到创建了一个复选框。 我改变了它,我将 bb = new CheckBox() 移到 foreach 中,但还是一样.. 【参考方案1】:

它应该看起来像这样:

import java.util.logging.Logger;

final Logger log = Logger.getLogger("LOG OUTPUT");

@Override
public void onSuccess(PagingLoadResult<GwtAccessRole> result) 

    if (result == null) 
        log.info("No data from the server");
        return;
    

    lista   = result.getData();

    FormPanel roleFormPanel = new FormPanel(FORM_LABEL_WIDTH);

    for (GwtAccessRole gwtAccessRole : lista) 
        bb = new CheckBox();
        bb.setBoxLabel(gwtAccessRole.getRoleName());
        roleFormPanel.add(bb);

        // display on the JS console output
        log.info("CheckBox added to roleFormPanel");
    

    bodyPanel.add(roleFormPanel);

    // confirm panel being added
    log.info("Panel added to body");

.gwt.xml 模块将添加以下行:

<inherits name="com.google.gwt.logging.Logging"/>
<set-property name="gwt.logging.enabled" value="TRUE"/> 

由于复选框超出范围,您没有向表单面板添加任何内容。

编辑:添加日志输出信息

【讨论】:

我一般用SimpleCheckBox代替CheckBox。还要检查您的表单面板是否正在使用 Chrome 或 Firefox 中的检查器添加到正文中。添加一些调试输出以确保它也能到达那段特定的代码。 我现在就试试。 更新了答案中的代码。希望日志记录能够将您带到某个地方。 是的,它是一个异步 RPC 调用,仅当服务器完成处理后才返回 onFailure 或 onSuccess。 99% 的 GWT 由事件运行,服务器调用相同。【参考方案2】:

请注意,FormPanel 是实现 HasOneWidget,因此如果您尝试将另一个小部件放入容器,它将覆盖它

【讨论】:

以上是关于为啥异步服务不填写复选框表单面板?的主要内容,如果未能解决你的问题,请参考以下文章

树形ztree 与angularjs结合,实现下级数据异步加载,点击复选框 填写到输入框里

使用复选框使用 AJAX 填充 rails 表单

为啥复选框状态并不总是传递给 PHP 脚本?

同组复选框name属性值不同会怎么样,为啥同组复选框name属性值要一样?

js页面用户信息填写表单

谷歌浏览器 表单自动填写