Tôi gặp sự cố với ràng buộc nguồn dữ liệu trong ListGrid với smartGWT. Tôi có GWT-RPC-DataSource và tôi đã thiết lập nó như là nguồn dữ liệu của tôiSMARTGWT DataSource (GWT-RPC-DATASource) LISTGRID
grid.setDataSource(ds);
Trên một nút bấm Tôi có một số thay đổi trong nguồn dữ liệu của tôi và tôi đang tạo ra nguồn dữ liệu mới và rebinding với lưới smartgwt của. nhưng nó không thành công. Tôi đã thử chức năng grid.redraw() để vẽ lại lưới.
Dưới đây là lớp học của tôi cho GWTRPCDATASOURCE
public abstract class GwtRpcDataSource extends DataSource {
/**
* Creates new data source which communicates with server by GWT RPC. It is
* normal server side SmartClient data source with data protocol set to
* <code>DSProtocol.CLIENTCUSTOM</code> ("clientCustom" - natively supported
* by SmartClient but should be added to smartGWT) and with data format
* <code>DSDataFormat.CUSTOM</code>.
*/
public GwtRpcDataSource() {
setDataProtocol(DSProtocol.CLIENTCUSTOM);
setDataFormat(DSDataFormat.CUSTOM);
setClientOnly(false);
}
/**
* Executes request to server.
*
* @param request
* <code>DSRequest</code> being processed.
* @return <code>Object</code> data from original request.
*/
@Override
protected Object transformRequest(DSRequest request) {
String requestId = request.getRequestId();
DSResponse response = new DSResponse();
response.setAttribute("clientContext",
request.getAttributeAsObject("clientContext"));
// Asume success
response.setStatus(0);
switch (request.getOperationType()) {
case FETCH:
executeFetch(requestId, request, response);
break;
case ADD:
executeAdd(requestId, request, response);
break;
case UPDATE:
executeUpdate(requestId, request, response);
break;
case REMOVE:
executeRemove(requestId, request, response);
break;
default:
// Operation not implemented.
break;
}
return request.getData();
}
/**
* Executed on <code>FETCH</code> operation.
* <code>processResponse (requestId, response)</code> should be called when
* operation completes (either successful or failure).
*
* @param requestId
* <code>String</code> extracted from
* <code>DSRequest.getRequestId()</code>.
* @param request
* <code>DSRequest</code> being processed.
* @param response
* <code>DSResponse</code>. <code>setData (list)</code> should be
* called on successful execution of this method.
* <code>setStatus (<0)</code> should be called on failure.
*/
protected abstract void executeFetch(String requestId, DSRequest request,
DSResponse response);
/**
* Executed on <code>ADD</code> operation.
* <code>processResponse (requestId, response)</code> should be called when
* operation completes (either successful or failure).
*
* @param requestId
* <code>String</code> extracted from
* <code>DSRequest.getRequestId()</code>.
* @param request
* <code>DSRequest</code> being processed.
* <code>request.getData()</code> contains record should be
* added.
* @param response
* <code>DSResponse</code>. <code>setData (list)</code> should be
* called on successful execution of this method. Array should
* contain single element representing added row.
* <code>setStatus (<0)</code> should be called on failure.
*/
protected abstract void executeAdd(String requestId, DSRequest request,
DSResponse response);
/**
* Executed on <code>UPDATE</code> operation.
* <code>processResponse (requestId, response)</code> should be called when
* operation completes (either successful or failure).
*
* @param requestId
* <code>String</code> extracted from
* <code>DSRequest.getRequestId()</code>.
* @param request
* <code>DSRequest</code> being processed.
* <code>request.getData()</code> contains record should be
* updated.
* @param response
* <code>DSResponse</code>. <code>setData (list)</code> should be
* called on successful execution of this method. Array should
* contain single element representing updated row.
* <code>setStatus (<0)</code> should be called on failure.
*/
protected abstract void executeUpdate(String requestId, DSRequest request,
DSResponse response);
/**
* Executed on <code>REMOVE</code> operation.
* <code>processResponse (requestId, response)</code> should be called when
* operation completes (either successful or failure).
*
* @param requestId
* <code>String</code> extracted from
* <code>DSRequest.getRequestId()</code>.
* @param request
* <code>DSRequest</code> being processed.
* <code>request.getData()</code> contains record should be
* removed.
* @param response
* <code>DSResponse</code>. <code>setData (list)</code> should be
* called on successful execution of this method. Array should
* contain single element representing removed row.
* <code>setStatus (<0)</code> should be called on failure.
*/
protected abstract void executeRemove(String requestId, DSRequest request,
DSResponse response);
private ListGridRecord getEditedRecord(DSRequest request) {
// Retrieving values before edit
JavaScriptObject oldValues = request
.getAttributeAsJavaScriptObject("oldValues");
// Creating new record for combining old values with changes
ListGridRecord newRecord = new ListGridRecord();
// Copying properties from old record
JSOHelper.apply(oldValues, newRecord.getJsObj());
// Retrieving changed values
JavaScriptObject data = request.getData();
// Apply changes
JSOHelper.apply(data, newRecord.getJsObj());
return newRecord;
}
}
tôi đã thực hiện lớp trừu tượng này đến lớp nguồn dữ liệu của riêng tôi đặt tên NTDatasource.
public class NTDataSource extends GwtRpcDataSource {
public static int total = 991;
Record[] records;
public NTDataSource() {
}
public void setData(List<NTListGridField> lstFields, Record[] records) {
// setTestData(records);
for (NTListGridField lstField : lstFields) {
if (lstField.getType() == ListGridFieldType.DATE) {
DataSourceDateField dateField = new DataSourceDateField(
lstField.getName());
dateField.setHidden(lstField.getAttributeAsBoolean("visible"));
if (lstField.getName().equals("id")) {
dateField.setHidden(true);
}
addField(dateField);
} else {
DataSourceTextField textField = new DataSourceTextField(
lstField.getName());
textField.setHidden(lstField.getAttributeAsBoolean("visible"));
if (lstField.getName().equals("id")) {
textField.setHidden(true);
textField.setPrimaryKey(true);
}
addField(textField);
}
}
total = records.length;
this.records = records;
}
@Override
protected void executeFetch(String requestId, DSRequest request,
DSResponse response) {
// assume we have 1000 items.
response.setTotalRows(total);
int end = request.getEndRow();
if (end > total) {
end = total;
}
Record returnRecords[] = new Record[end
- request.getStartRow()];
for (int i = request.getStartRow(); i < end; i++) {
ListGridRecord r = new ListGridRecord();
r = (ListGridRecord) records[i];
returnRecords[i - request.getStartRow()] = r;
}
GWT.log(" called from " + request.getStartRow() + " to "
+ request.getEndRow() + " result " + returnRecords.length, null);
response.setData(returnRecords);
processResponse(requestId, response);
}
@Override
protected void executeAdd(String requestId, DSRequest request,
DSResponse response) {
// TODO Auto-generated method stub
}
@Override
protected void executeUpdate(String requestId, DSRequest request,
DSResponse response) {
// TODO Auto-generated method stub
}
@Override
protected void executeRemove(String requestId, DSRequest request,
DSResponse response) {
// TODO Auto-generated method stub
}
}
điều này trông rất tuyệt, bạn đã xây dựng gwtRpcDataSource từ một số hướng dẫn hay gì đó chưa? – javaNoober