繁体   English   中英

将数据绑定到GWT中的UI

[英]Binding data to the UI in GWT

在Silverlight中,常用的模式是:

  1. 索取资料
  2. 取回一个空的数据容器
  3. 异步触发查询以填充容器
  4. 查询返回时,在容器上触发一个事件
  5. 根据容器的内容更新用户界面

可以在GWT中完成吗?

我问的原因是我正在尝试创建一个包含组名和图标列表的SuggestBox 首先,我Facebook查询来获取接近在当前字符串组ID列表SuggestBox 然后,我启动查询以获取每个组ID的图标。 问题是在完成这些查询之前,我必须返回建议。 我不确定在获得数据后如何返回并插入数据。 我不想在调用完成之前阻塞,也没有真正的方法预先知道要加载哪些数据。

我可以为加载图像的建议返回一个小部件,但是建议必须为纯字符串。

这里正确的方法是什么?

假设您正在使用GWT RPC。 您将具有一些服务界面,可让您获取groupIds以获得建议以及图标获取特定的组ID。

public interface FacebookService extends RemoteService {

    List<String> getFacebookGroupIds(String suggestion);

    Icon getIconForGroup(String groupId);
}

您应该构建自己的“建议”实施,该建议可以仅使用groupId或groupId和一个Icon进行显示。

public class FacebookGroupSuggestion implements Suggestion {

    private String groupId;

    private Icon icon;

    public FacebookGroupSuggestion(String groupId) {
        this.groupId = groupId;
    }

    public String getDisplayString() {
        StringBuilder builder = new StringBuilder();
        builder.append("<b>");
        builder.append(this.groupId);
        builder.append("</b>");
        if (this.icon != null) {
            builder.append(this.icon.toSafeHtml());
        }
        return builder.toString();
    }
}

我使用Icon作为您自己的图标实现,这不是标准类。 然后,您可以使ModifyOracle的实现异步获取组id和图标。 RecommendationOracle使用回调来通知notifyBox可以使用对请求的某些响应。 因此,获取您的结果,并在获取结果时调用回调。 它看起来像这样。

public class FacebookSuggestOracle extends SuggestOracle {

    private FacebookServiceAsync service = GWT.create(FacebookService.class);
    private Request currentRequest;
    private Callback currentCallback;

    @Override
    public void requestSuggestions(Request request, Callback callback) {
        // Save request & callback for future use.
        this.currentRequest = request;
        this.currentCallback = callback;

        // Fetch the groupIds
        service.getFacebookGroupIds(request.getQuery(), new AsyncCallback<List<String>>() {
            public void onSuccess(List<String> result) {
                createSuggestionsForGroupIds(result);
            }

        });

    }

    private void createSuggestionsForGroupIds(List<String> groupIds) {
        List<FacebookGroupSuggestion> suggestions = new ArrayList<FacebookGroupSuggestion>();
        for (String groupId : groupIds) {
            suggestions.add(new FacebookGroupSuggestion(groupId));
        }
        Response response = new Response(suggestions);
        // Tell the suggestBox to display some new suggestions
        currentCallback.onSuggestionsReady(currentRequest, response);

        // Fetch the icons
        for (String groupId : groupIds) {
            service.getIconForGroup(groupId, new AsyncCallback<Icon>() {

                public void onSuccess(Icon result) {
                    // match the icon to the groupId in the suggestion list
                    // use the callback again to tell the display to update itself

                }

            });
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM