위와 같이 게시판에서 kendoGrid
와 kendoListView
를 이용해 같은 데이터를 두 가지 버전으로 게시물을 보여주는 UI를 개발했습니다.
하지만 kendoGrid
와 kendoListView
를 각각의 DataSource
로 구성해 본 결과 같은 요청이 두 번씩 발생하는 문제가 발견되었습니다.
var dataSource = new kendo.data.DataSource({
transport: {
read: {
url: "https://demos.telerik.com/kendo-ui/service/products",
dataType: "jsonp"
}
},
pageSize: 10
});
$("#grid").kendoGrid({
dataSource: dataSource,
pageable: true
});
$("#listview").kendoListView({
dataSource: dataSource,
pageable: true
});
위와 같이 코드를 작성하게 되면 kendoGrid
를 구성하기 위한 dataSource
요청 한 번, kendoListView
를 구성하기 위한 dataSource
요청 한 번, 총 두 번의 서버로의 요청이 발생합니다.
같은 데이터를 사용하기 때문에 두 번의 요청이 발생하는 것은 불필요하였고 요청을 간소화 하는 방법을 찾아야 했습니다.
해결 방법은 autoBind
옵션을 사용하는 것입니다.
공식 문서에서의 autoBind
설명입니다.
설명을 요약하면 autoBind
를 false
로 비활성화하면 공유 데이터 원본이 원격 서비스에 둘 이상의 요청을 만들지 않게 됩니다.
즉, 한 번의 요청만으로 응답받은 데이터를 여러 UI에서 재사용 할 수 있습니다.
var dataSource = new kendo.data.DataSource({
transport: {
read: {
url: "https://demos.telerik.com/kendo-ui/service/products",
dataType: "jsonp"
}
},
pageSize: 10
});
$("#grid").kendoGrid({
dataSource: dataSource,
pageable: true
});
$("#listview").kendoListView({
dataSource: dataSource,
pageable: true,
autoBind : false
});
이렇게 설정하게 되면 kendoGrid
를 구성하기 위한 dataSource
가 한 번 요청되고, 이 dataSource
를 kendoListView
에서 재사용하게 되어 총 한 번의 서버로의 호출이 발생합니다.
💥 주의점은 autoBind
를 하기 전 이미 dataSource
가 read
되어있어야 합니다. 서버로의 요청이 한 번이라도 발생이 되어야 이 값을 재사용할 수가 있습니다.
현재까지의 코드를 보면 kendoGrid
가 먼저 작성되어야 kendoListView
가 dataSource
를 사용할 수 있다는 문제점이 아직 남아있습니다.
이렇게 되면 kendoListView
말고 이 dataSource
를 재사용하고 싶은 다른 UI를 추가할 때 혼동이 생길 가능성이 있어 리팩토링을 진행했습니다.
var dataSource = new kendo.data.DataSource({
transport: {
read: {
url: "https://demos.telerik.com/kendo-ui/service/products",
dataType: "jsonp"
}
},
pageSize: 10
});
var grid = $("#grid").kendoGrid({
pageable: true,
autoBind : false
}).data("kendoGrid");
var listview = $("#listview").kendoListView({
pageable: true,
autoBind : false
}).data("kendoListView");
dataSource.read().then(function () {
grid.setDataSource(dataSource);
listview.setDataSource(dataSource);
grid.refresh();
listview.refresh();
});
위의 코드는 kendoGrid
와 kendoListView
자체에서 dataSource
를 지정하지 않고 autoBind
옵션을 주는 방식으로 개발했습니다.
먼저, dataSource
를 read
메서드를 통해 자체적으로 읽고 콜백 메서드인 then
을 호출 시킵니다.
읽어온 dataSource
를 kendoGrid
와 kendoListView
에 각각 setDataSource
로 세팅을 한 후 refresh
메서드를 통해 UI를 새로고침 합니다.
refresh()
를 하는 이유는?refresh
메서드에 대한 공식문서 설명입니다.
refresh
를 하는 이유는 dataSource
를 read
하게 되면 서버로 요청 후 dataSource
만 다시 로드하고 UI는 변경을 하지 않기 때문입니다.
refresh
메서드를 통해 UI 항목을 반드시 다시 렌더링 해주어야 합니다.
dataSource
를 재사용 하고 싶다면 UI에 autoBind
옵션을 주면 됩니다.dataSource
를 read
메서드로 읽고 UI에 setDataSource
를 하게 되면 UI는 변경되지 않으니 꼭 UI를 refresh
메서드를 통해 다시 렌더링 해주어야 합니다.