2009년 5월 19일 화요일

CheckboxSelectionModel.getSelections()의 return array의 처리

if ( caSelectionModel.getCount() > 0  ) {
var selectedCA = caSelectionModel.getSelections();
Ext.Ajax.request({
url: '/gridsphere/gridsphsere?cid=managerclock',
success: function() {
caListStore.load();
},
params: {
'action': 'delete_ca',
'target_list': selectedCA
}
});
}

일단...

selection model에서 user가 선택한 rows를 array로 리턴한 값을

request로 실어 보내야 하는 상황이다.


기본적으로 array가 어떻게 사용되는지는 javascript를 봐야할 듯 싶고..

request로 보낼때는 어떻게 해야할지 감이 안잡힌다.


==================================================================================

if ( caSelectionModel.getCount() > 0  ) {
// 삭제할 CA들의 정보를 array로 바꾸어서 전달해야한다.
var selectedCAs = caSelectionModel.getSelections();
var selectedCARecords = []; // javascript
for ( idx in selectedCAs ){
if ( typeof selectedCAs[idx] == 'object' ) {
selectedCARecords.push(selectedCAs[idx].data.uid);
selectedCARecords.push(selectedCAs[idx].data.name);
selectedCARecords.push(selectedCAs[idx].data.path);
selectedCARecords.push(selectedCAs[idx].data.caCertificateName);
selectedCARecords.push(selectedCAs[idx].data.signingPolicyName);
selectedCARecords.push(selectedCAs[idx].data.release);
}
}
Ext.Ajax.request({
url: '/gridsphere/gridsphere?cid=managerclock',
success: function() {
caListStore.load();
},
params: {
'action': 'delete_ca',
'target_list': selectedCARecords
}
});
}

여기에서의 문제는 ExtJS에서 request로 넘긴 target_list가 server에서는 올바로 읽혀지지 않는다는 것이다.

request에서 넘겨질 때부터 이미 무명 object로 넘어가기 때문에 server side에서 알아챌리가 만무하다.

ExtJS에선 request에 array를 전달하면 알아서 개별 값으로 풀어 넘겨주기는 하지만, 실제로 getSelections()에서 넘어온 Array는 ExtJS에서나 통용되는 Array일 뿐이지, server에서는 모르는 값이 넘어올 뿐인 거다.


이 부분을 해결하려면,

ExtJS에서 자체적으로 변환 과정을 거쳐 request에서 올바로 인식할 수 있는 array 형태로 보내주면 된다.

여기서 주의할 부분은 SelectionModel에서 넘어온 Array에는 다양한 형태의 properties(array, function..)가 존재하기 때문에 data를 가진 property만 array로 만들어 주어야한다. 이 확인 과정은 위 코드의 if문에 해당한다.


※ 이 문제를 해결하기 위해서는 request의 array 전달 과정과 javascript에 대한 기본 지식이 필요하다.

댓글 없음:

댓글 쓰기