[]
Wijmo의 RESTCollectionView 클래스는 CollectionView 클래스를 확장하여 REST 기능을 __CollectionView__에 통합할 수 있도록 하며, 더 나아가 확장을 통해 CollectionView 클래스를 사용하는 모든 컨트롤을 사용할 수 있도록 합니다.
__RESTCollectionView__는 CRUD 기능을 지원합니다. 이 옵션을 사용하려면 __RESTCollectionView__를 확장하는 클래스를 만들고 다음 메서드에 대한 재정의를 추가하시길 바랍니다:
getItems: 서버에서 항목 목록을 가져옵니다. 목록을 정렬, 필터링 및 페이징 할 수 있습니다.
addItems: 서버의 컬렉션에 항목을 추가합니다.
patchItem: 서버의 컬렉션에 있는 항목을 편집합니다.
deleteItem: 서버의 컬렉션에서 항목을 삭제합니다.
기본적으로 클래스는 서버에서 정렬, 필터링 및 페이징을 수행해야 합니다.
REST 서비스가 이러한 작업을 지원하지 않는 경우 sortOnServer, pageOnServer 또는 filterOnServer 속성이 __false__로 설정되고, 해당 작업이 클라이언트에서 대신 수행되는지 확인하시길 바랍니다.
RESTCollectionView 클래스를 확장하여 데이터 소스와 직접 통신하는 사용자 지정 RESTCollectionView 클래스를 만들 수 있습니다. 예를 들어 RESTCollectionView 클래스를 확장하여 JSONPlaceholder 소스와 통신하는 사용자 지정 RESTCollectionViewOData 클래스를 만들 수 있습니다.
먼저 변수를 초기화하고 CRUD 작업에서 사용할 수 있는 몇 가지 메서드을 만들어야 합니다:
import { RESTCollectionView } from '@mescius/wijmo.rest';
import { httpRequest, copy, asString, assert } from '@mescius/wijmo';
export class RESTCollectionViewJSON extends RESTCollectionView {
constructor(tableName, options) {
super();
this._url = 'https://jsonplaceholder.typicode.com/';
this._tbl = asString(tableName);
copy(this, options);
// this source does not support server-side pagination, sorting, or filtering.
this.pageOnServer = false;
this.sortOnServer = false;
this.filterOnServer = false;
}
/**
* Gets or the name of the key field.
*
* Key fields are required for update operations (add/remove/delete).
*/
get key() {
return this._key;
}
set key(value) {
this._key = asString(value);
}
// ** implementation
_getWriteUrl(item) {
let url = this._url + this._tbl;
assert(this.key != null, 'write operations require keys');
return url + '/' + item[this.key];
}
_jsonReviver(key, value) {
if (typeof value === 'string' && _rxDate.test(value)) {
value = value.indexOf('/Date(') == 0 // verbosejson
? new Date(parseInt(value.substr(6)))
: new Date(value);
}
return value;
}
}
get/set 키() 메서드는 업데이트 작업에 사용되고, _getWriteUrl()은 URL을 구성하며 jsonReviver()는 JSON을 업데이트합니다.
RESTCollectionViewOData 클래스는 Wijmo와 함께 나오는 ODataCollectionView 클래스와 유사하게 작동합니다. CRUD 작업과 서버 기반 정렬, 필터링 및 페이지 지정을 지원합니다. CRUD 기능을 사용하기 위해선 CRUD 메서드를 재정의해야 합니다:
getItems() {
return __awaiter(this, void 0, void 0, function* () {
// cancel any pending requests
if (this._pendingRequest) {
//console.log('aborting pending request');
this._pendingRequest.abort();
}
return new Promise(resolve => {
let url = this._url + this._tbl;
this._pendingRequest = httpRequest(url, {
success: (xhr) => __awaiter(this, void 0, void 0, function* () {
let arr = JSON.parse(xhr.responseText, this._jsonReviver);
resolve(arr);
}),
error: xhr => this._raiseError(xhr.responseText, false),
complete: xhr => this._pendingRequest = null // no pending requests
});
});
});
}
addItem(item) {
return new Promise(resolve => {
let url = this._url + this._tbl;
let requestHeaders = {
'Content-Type': 'application/json; charset=UTF-8'
};
if (this.requestHeaders) {
for (let k in this.requestHeaders) {
requestHeaders[k] = this.requestHeaders[k];
}
}
let newItem = {};
for (let k in item) {
if (k != this.key) {
newItem[k] = item[k];
}
}
httpRequest(url, {
method: 'POST',
requestHeaders: requestHeaders,
data: newItem,
success: xhr => {
let newItem = JSON.parse(xhr.responseText, this._jsonReviver);
item[this.key] = newItem[this.key];
this.refresh();
},
error: xhr => this._raiseError(xhr.responseText, true)
});
});
}
patchItem(item) {
return new Promise((resolve) => {
let url = this._getWriteUrl(item);
httpRequest(url, {
method: 'PUT',
requestHeaders: this.requestHeaders,
data: item,
success: xhr => resolve(item),
error: xhr => this._raiseError(xhr.responseText, true)
});
});
}
deleteItem(item) {
return new Promise(resolve => {
let url = this._getWriteUrl(item);
httpRequest(url, {
method: 'DELETE',
requestHeaders: this.requestHeaders,
success: xhr => {
resolve(item);
},
error: xhr => this._raiseError(xhr.responseText, true)
});
});
}
이제 JavaScript 파일에서 RESTCollectionView를 호출하여 FlexGrid 컨트롤을 위한 데이터 소스로 사용할 수 있습니다.
// Extended RESTCollectionView class
import { RESTCollectionViewJSON } from './rest-collection-view-json';
import { FlexGrid } from '@mescius/wijmo.grid';
function init() {
// create the grid to show the data
let theGrid = new FlexGrid('#theGrid', {
allowAddNew: true,
allowDelete: true,
showMarquee: true,
selectionMode: 'MultiRange',
deferResizing: true,
alternatingRowStep: 0,
// create RESTCollectionViewJSON
itemsSource: new RESTCollectionViewJSON('todos', {
key: 'id',
pageSize: 8
})
});
}