extのソースを調べた後、機能するが完全ではない解決策を見つけました。
「drop-allowed-indication」は、treeviewdragdrop-pluginのonViewRenderで作成された基になるDropZoneによって処理できます。これは文書化されていませんが、プラグインのソースコードで確認できます。
(少なくともこの例では)実行する必要があるのは、DropZoneのonNodeOver-&onContainerOver-メソッドをオーバーライド/拡張して、drop-not-allowed-またはdrop-allowed-indicationに適切なcssクラスを返すことです。
Ext.override(Ext.view.DropZone, {
onNodeOver: function(nodeData, source, e, data) {
if (data && data.records && data.records[0]) {
// The check should be better specified, e.g. a
// female with the name 'Malena' would be recognized as male!
if (nodeData.innerHTML.indexOf(data.records[0].get('sex')) < 0) {
return this.dropNotAllowed;
}
}
return this.callOverridden([nodeData, source, e, data]);
},
onContainerOver: function(source, e, data) {
return this.dropNotAllowed;
}
});
実例: http: //jsfiddle.net/suamikim/auXdQ/
このソリューションについて私が気に入らないことがいくつかあります。
- オーバーライドにより、アプリケーション内のすべてのDropZoneの動作が(定義ごとに...)変更されます。1つのグリッドの特定のDropZoneのみをオーバーライド/拡張するにはどうすればよいですか?
私は次のことを試しました:
- グリッドビューがレンダリングされた後、dropZoneにインターセプターを追加します。http://jsfiddle.net/suamikim/uv8tX/これ
は、正しいdrop-allowed-indicationを示しているため、最初は機能しているように見えますが、インジケーターがあったとしてもレコードをドロップします。許可されていないことを示します(常に「緑色の線」が表示されます...)
- treeviewdragdrop-pluginを拡張する新しいdnd-pluginを定義し、作成後にdropZoneのonNodeOver-methodをオーバーライドします。http://jsfiddle.net/suamikim/5v67W/この
種類は、interceptation-methodとは逆のことを行います。また、正しい表示が表示されますが、「緑色の線」が表示されることはなく、どこにでもドロップすることはできません...
- オーバーライドしているクラス(Ext.view.DropZone)は、ドキュメントでプライベートとしてマークされており、直接使用しないでください...
これらの2つの問題についてのコメントと、さらに良い解決策をいただければ幸いです。
ありがとう、mik
編集:
元のgridviewdragdrop-pluginを拡張する新しいdnd-pluginを定義したバージョンを調整しました。「魔法」は、gridviewdropzoneを拡張し、onNodeOverメソッドを単にオーバーライドするのではなく拡張することでした。
これを行う必要があるのは、現在callParentによって呼び出されている元のonNodeOverメソッドが「緑色の線」を処理し、最終的にドロップを許可するためです。
私の拡張gridviewdragdrop-pluginが今行う唯一のことは、onViewRender-methodで標準のgridviewdropzoneの代わりに新しいdropzone-classのインスタンスを作成することです。
これはこれまでのところ合理的な方法のようです。
// Extend the treeview dropzone
Ext.define('ExtendedGridViewDropZone', {
extend: 'Ext.grid.ViewDropZone',
onNodeOver: function(nodeData, source, e, data) {
if (data && data.records && data.records[0]) {
// The check should be specified, e.g. a female with the name 'Malena' would be recognized as male!
if (nodeData.innerHTML.indexOf(data.records[0].get('sex')) < 0) {
return this.dropNotAllowed;
}
}
return this.callParent(arguments);
},
onContainerOver: function(source, e, data) {
return this.dropNotAllowed;
}
});
Ext.define('ExtendedGridDnD', {
extend: 'Ext.grid.plugin.DragDrop',
alias: 'plugin.extendeddnd',
onViewRender: function(view) {
this.callParent(arguments);
// Create a instance of ExtendedGridViewDropZone instead of Ext.grid.ViewDropZone
this.dropZone = Ext.create('ExtendedGridViewDropZone', {
view: view,
ddGroup: this.dropGroup || this.ddGroup
});
}
});
実例: http: //jsfiddle.net/5v67W/1/
それでもなお、もっと簡単にできるように感じられるので、さまざまなアプローチに感謝します...