2013-05-02 56 views
0

我試圖從服務器獲取異步數據後選擇CellTree的第一個根節點。這裏是我的代碼:如何在首次數據提取後選擇GWT CellTree節點之一?

public class MyTreeModel implements TreeViewModel{ 

private MyServiceAsync myService = GWT.create(MyService.class); 

    public <T> NodeInfo<?> getNodeInfo(T value) { 

     Cell<MyTO> cell = new AbstractCell<MyTO>() { 
      @Override 
      public void render(Context context, MyTO value, SafeHtmlBuilder sb) { 
       //rendering node... 
      } 
     }; 

     return new DefaultNodeInfo<MyTO>(value instanceof MyTO ? 
       createBranchDataProvider((MyTO)value) : //fetching child nodes 
       cerateRootDataProvider(), cell); //fetching root nodes 
    } 

@Override 
public boolean isLeaf(Object value) { 

    if (value instanceof MyTO) { 
     MyTO to = (MyTO)value; 
     return to.isLeafNode(); 
    } 
    return false; 
} 

private AbstractDataProvider<MyTO> cerateRootDataProvider() { 
    AsyncDataProvider<MyTO> dataProvider = new AsyncDataProvider<MyTO>() { 
     @Override 
     protected void onRangeChanged(HasData<MyTO> display) { 
      AsyncCallback<List<MyTO>> callback = new AsyncCallback<List<MyTO>>() { 
       @Override 
       public void onSuccess(List<MyTO> result) { 
        updateRowCount(result.size(), true); 
        updateRowData(0, result); 
       } 
       @Override 
       public void onFailure(Throwable caught) { 
        Window.alert(caught.toString()); 
       } 
      }; 
      myService.getRootNodes(callback); 
     } 
    }; 

    return dataProvider; 
} 

private AbstractDataProvider<MyTO> createBranchDataProvider(final MyTO value) { 
    AsyncDataProvider<MyTO> dataProvider = new AsyncDataProvider<MyTO>() { 
     @Override 
     protected void onRangeChanged(HasData<MyTO> display) { 
      AsyncCallback<List<MyTO>> callback = new AsyncCallback<List<MyTO>>() { 
       @Override 
       public void onSuccess(List<MyTO> result) { 
        updateRowCount(result.size(), true); 
        updateRowData(0, result); 
       } 
       @Override 
       public void onFailure(Throwable caught) { 
        Window.alert(caught.toString()); 
       } 
      }; 
      myService.getChildNodes(value.getId(), callback); 
     } 
    }; 
    return dataProvider; 
} 

對於那些存儲在客戶端解決方案的數據看起來很簡單:我們可能只需要調用類似

tree.getRootTreeNode().setChildOpen(0, true, true); 

,但如果我們想獲取數據不同步,我們將抓住IndexOutOfBoundsException異常的我們在創建樹之後立即嘗試相同的情況,因爲還沒有獲得數據。如何知道何時onSuccess()事件將在cerateRootDataProvider()中被觸發?或者我可以使用其他解決方案?請提出建議。

回答

0

我看到兩個選項,在合適的時機調用

tree.getRootTreeNode().setChildOpen(0, true, true); 

  1. 演示者直接依賴:添加一個構造函數爲您MyTreeModel對象。發送相應的演示者作爲參數。在onSuccess方法的末尾添加並調用類似presenter.onDataLoadingComplete()的東西。

  2. 自定義事件:創建您的自定義事件。在onSuccess方法的末尾點火。在可以調用access`tree``object的地方訂閱它。調用必要的代碼。