我正在使用SmartGWT在GWT上用GAE编写一个项目。
我有一个带对象的数据库,每个都有一个“父”对象和“儿子”,我正在使用TreeGrid来表示它们。我已经有了一个GWT-RPC服务来获取给定节点的儿子。
我现在需要的是以某种方式在打开树节点时扩展DataSource类s.t,我将能够使用我自己的服务去获取它的儿子 - 然后将它们作为TreeGrid可以使用的东西返回。
我知道我想覆盖transformRequest和transformResponse,但我不知道怎么做。任何代码示例/解释都将非常感谢!
这是我到目前为止所做的 - 不确定它是否远程正确:
budgetTree.setDataSource(new DataSource() {
@Override
protected Object transformRequest(final DSRequest dsRequest) {
expensesService.getExpensesByYear(2008,
new AsyncCallback<ExpenseRecord[]>() {
@Override
public void onSuccess(ExpenseRecord[] result) {
System.out.println("Returned " + result.length + " expense record ");
dsRequest.setAttribute("dsResult", result);
}
@Override
public void onFailure(Throwable caught) {
System.out.println("Failed to run query");
}
});
return dsRequest;
}
@Override
protected void transformResponse(DSResponse response, DSRequest request,
Object data) {
Record[] recs = request.getAttributeAsRecordArray("dsResult");
response.setData(recs);
super.transformResponse(response, request, data);
}
});
答案 0 :(得分:1)
由于您自己正在执行实际请求,因此首先需要查看
setDataProtocol(DSProtocol.CLIENTCUSTOM);
然后在onSuccess
和onFailure
中,您需要拨打processResponse()
来拨打transformResponse()
public class MyDatasource extends DataSource{
public MyDatasource(){
setDataProtocol(DSProtocol.CLIENTCUSTOM)
}
@Override
protected Object transformRequest(final DSRequest dsRequest) {
expensesService.getExpensesByYear(2008,
new AsyncCallback<ExpenseRecord[]>() {
@Override
public void onSuccess(ExpenseRecord[] result) {
DSResponse response = new DSResponse();
System.out.println("Returned " + result.length + " expense record ");
dsRequest.setAttribute("dsResult", result);
Record[] recs = request.getAttributeAsRecordArray("dsResult");
response.setData(recs);
processResponse(dsRequest.getRequestId(), dsResponse);
}
@Override
public void onFailure(Throwable caught) {
DSResponse response = new DSResponse();
System.out.println("Failed to run query");
processResponse(dsRequest.getRequestId(), dsResponse);
}
});
return dsRequest;
}
}