即使商店有数据,Gwt sencha网格(requestfactory)也不显示数据

时间:2014-05-01 02:32:48

标签: gwt grid gxt requestfactory

我有一个sencha网格,它有一个requestfactory来提取数据。 我可以从服务器提取数据,但它没有显示出来。

我需要能够从组合框中进行2次选择,然后单击按钮重新加载网格。但它似乎不起作用。

这是代码 -

@Override
public Widget asWidget() {
    final ExplorerRequestFactory rf = GWT
            .create(ExplorerRequestFactory.class);
    rf.initialize(new SimpleEventBus());

    RequestFactoryProxy<FilterPagingLoadConfig, PagingLoadResult<FlowerProxy>> proxy = new RequestFactoryProxy<FilterPagingLoadConfig, PagingLoadResult<FlowerProxy>>() {
        @Override
        public void load(
                final FilterPagingLoadConfig loadConfig,
                final Receiver<? super PagingLoadResult<FlowerProxy>> receiver) {
            FlowerRequest req = rf.flowerRequest();
            List<SortInfo> sortInfo = createRequestSortInfo(req,
                    loadConfig.getSortInfo());

            req.getFlowers(vId, fId, loadConfig.getOffset(),
                    loadConfig.getLimit(), sortInfo).to(receiver);
            req.fire();

        }
    };
    loader = new PagingLoader<FilterPagingLoadConfig, PagingLoadResult<FlowerProxy>>(
            proxy) {
        @Override
        protected FilterPagingLoadConfig newLoadConfig() {
            return new FilterPagingLoadConfigBean();
        }
    };
    loader.setRemoteSort(true);

    FlowerProxyProperties props = GWT.create(FlowerProxyProperties.class);

    ListStore<FlowerProxy> store = new ListStore<FlowerProxy>(props.id());
    loader.addLoadHandler(new LoadResultListStoreBinding<FilterPagingLoadConfig, FlowerProxy, PagingLoadResult<FlowerProxy>>(
            store) {
        @Override
        public void onLoad(
                final LoadEvent<FilterPagingLoadConfig, PagingLoadResult<FlowerProxy>> event) {
            LOG.info("Loader:addloadHondaler");
            super.onLoad(event);

            view.getView().refresh(false);
            view.getView().layout();
//********Data successfully retrieved but does not populate the grid *********///
//**************************///
            LOG.info("onLoad size:" + view.getStore().size()); //Data is present
        }
    });

    final PagingToolBar toolBar = new PagingToolBar(50);
    toolBar.getElement().getStyle().setProperty("borderBottom", "none");
    toolBar.bind(loader);

    ColumnConfig<FlowerProxy, String> nameColumn = new ColumnConfig<FlowerProxy, String>(
            props.name(), 150, "Name");
    ColumnConfig<FlowerProxy, Date> dateColumn = new ColumnConfig<FlowerProxy, Date>(
            props.LastAccessDate(), 150, "Date");
    dateColumn.setCell(new DateCell(DateTimeFormat
            .getFormat(PredefinedFormat.DATE_SHORT)));

    List<ColumnConfig<FlowerProxy, ?>> l = new ArrayList<ColumnConfig<FlowerProxy, ?>>();
    l.add(nameColumn);
    l.add(dateColumn);

    ColumnModel<FlowerProxy> cm = new ColumnModel<FlowerProxy>(l);

    view = new Grid<FlowerProxy>(store, cm);
    view.getView().setForceFit(true);
    view.setLoadMask(true);
    view.setLoader(loader);

    // Create the filters, and hook them to the loader and grid
    GridFilters<FlowerProxy> filters = new GridFilters<FlowerProxy>(loader);
    filters.initPlugin(view);

    filters.addFilter(new DateFilter<FlowerProxy>(props.LastAccessDate()));
    filters.addFilter(new StringFilter<FlowerProxy>(props.name()));


    VerticalLayoutContainer con = new VerticalLayoutContainer();
    con.setBorders(true);
    con.setPixelSize(400, 300);
    con.add(view, new VerticalLayoutData(1, 1));
    con.add(toolBar, new VerticalLayoutData(1, -1));

    return con.asWidget();
}
     //********Call to this function should trigger a data pull and populate the grid ******///
    /****************/
    // Requestfactory call goes through, gets the data too but does not update the grid
public void reload(final String v, final String flower) {
    LOG.info("V=> " + v + "\tFlower=> " + flower);
    this.vId = v;
    this.fId = flower;
    LOG.info("Store size:" + view.getStore().size());
    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
        @Override
        public void execute() {
            if (v != null && flower != null && v.length() > 0
                    && flower.length() > 0) {
                loader.load();
                LOG.info("Loader called");
            } 
        }
    });

}

我在这里缺少什么想法?

1 个答案:

答案 0 :(得分:1)

无法运行代码(因为您没有发布代理,服务器实体,服务代理(也称为请求)或服务实现,它有点难以说,但我确实看到了至少有一件事肯定是错的,其他的可能会让人感到困惑。

首先,每次调用时都从asWidget()返回相同的实例。我猜的一系列事件正在发生,令你感到困惑:

  • 应用程序启动,有些东西会创建一个小部件的实例,其中存在此​​asWidget方法。在设置过程中,创建一个商店,就像加载器一样,并且this.loader被分配给该加载器。小部件已添加到dom。
  • 在某些时候,第二次调用asWidget()。这会留下旧网格(从第一次调用时),并创建一个新网格,一个新商店,一个新加载器(并分配给this.loader),但可能不会对该新网格做任何事情< / LI>
  • 最后调用reload。这有一个有效的加载器(新的,不是旧的),调用服务器,填充新的存储,它吸引新的网格。但是,旧网格仍然附着,因此数据永远不会显示出来。

修复此问题后,您实际上不需要覆盖LoadResultListStoreBinding中的任何方法 - 基类会将项目添加到商店,商店将发出网格正在侦听的事件。< / p>