beforenodedropイベント内でajaxを呼び出そうとしています。成功すると、ツリーを操作し続けます。 しかし、イベントは中断されます。beforenodedropの内部でajaxを呼び出す方法はありますか。ExtJS - beforenodedropでのコールajax Ext.tree.TreePanelイベント
ありがとうございました。
ここに私のコード:
// Moving nodes from data grid to tree
beforenodedrop : {
fn : function(e) {
e.cancel = true;
enableBtnEditAndDelete(false);//Disabling those btns edit and delete from grid toolbar
// e.data.selections is the array of selected records from grid
if (Ext.isArray(e.data.selections)) {
// setup dropNode (it can be array of nodes)
e.dropNode = [];
if(e.target.id != this.root.id) {
processBarWin.show();
var newParentId = e.target.leaf ? e.target.parentNode.attributes.idFolder : e.target.attributes.idFolder;
var idsToUpdate = '';
//Obj to log
var objLog = document.getElementById('log');
for (var i = 0; i < e.data.selections.length; i++) {
// get record from selectons
var r = e.data.selections[i];
idsToUpdate += i > 0 ? ', ' + r.get('id') : r.get('id');
nodesToCreate[i] = this.loader.createNode({
text : r.get('description'),
leaf : true,
editable: false,
idIdea : r.get('id'),
description : r.get('description'),
content : r.get('content'),
idFolder : r.get('idFolder'),
insertDate : r.get('insertDate'),
updateDate : r.get('updateDate'),
qtip : r.get('content').substring(0, 50) + "..."
});
}
objLog.innerHTML = objLog.innerHTML + "after for<br />";
// reset cancel flag, permit to drop items
e.cancel = false;
for (var i = 0; i < e.data.selections.length; i++) {
// get record from selectons
var r = e.data.selections[i];
// create node from record data
e.dropNode.push(this.loader.createNode({
text : r.get('description'),
leaf : true,
editable: false,
idIdea : r.get('id'),
description : r.get('description'),
content : r.get('content'),
idFolder : r.get('idFolder'),
insertDate : r.get('insertDate'),
updateDate : r.get('updateDate'),
qtip : r.get('content').substring(0, 50) + "..."
}));
}
Ext.Ajax.request({
url: 'Action/deuErro.php',
method: 'POST',
params: {
action: 'updateIdeaParent',
ids : idsToUpdate,
idFolder : newParentId
},
success: function(){
objLog.innerHTML = objLog.innerHTML + "success<br />";
for (var i = 0; i < e.data.selections.length; i++) {
var r = e.data.selections[i];
gridStore.remove(r);
}
processBarWin.hide();
},
failure: function(){
objLog.innerHTML = objLog.innerHTML + "failure<br />";
processBarWin.hide();
yaMsgError(a.result.errors.title, a.result.errormsg);
return false;
}
});
} else {
yaMsgWarn(msgActionNotAllowed);
return false;
}
} else { // from tree, not from the grid
//nothing here
}
// We want Ext to complete the drop, thus return true
return true;
}
}
よろしく、 ティアゴ
waaaaayあまりにも多くのコード。あなたが正しいことをしているように見えます。 Ajaxの呼び出しが非同期であることを覚えておいてください。つまり、関数が終了した後に戻ります。 – dbrin
はDmitryBに同意します。あなたのハンドラをafterdropイベントに移動させ、ツリーをその作業に任せるべきでしょうか?あなたはいつでもツリーを後で修正することができます。 –