1. 如何确定用户何时尝试编辑列?
您可以使用dgrid-editor-show
编辑器插件调度的事件。
2. 然后我如何访问 dijit/form/Select 以便我可以更新它?
您将有权从事件处理程序访问 column.editorInstance
3. 我怎样才能延迟显示编辑器,直到它被填充?
为此,我确实必须访问 column.editorInstance 的私有成员,但我能够通过使用dojo/when
on来完成任务column.editorInstance._queryRes
一旦结果出来,我还需要它来设置编辑器的值。
这是我的解决方案:
define([
"dojo",
"dojo/when",
"sb",
"put-selector/put",
"dgrid/editor",
"dijit/form/Select"
], function(dojo, when, sb, put, editor, Select){
dojo.global.storm.grid.columns.proposals = function(column){
//We have to keep some cached display values since our editor
//will only contain the display values from the last request
var cache = {};
//Use the init function to access the grid
//so we can attach the event handler to `dgrid-editor-show`
column.init = function() {
column.grid.on('.dgrid-cell:dgrid-editor-show', function(evt) {
//My data contains null values,
//so I need to convert them to strings
if (evt.cell.row.data[column.field] == null) {
evt.cell.row.data[column.field] = "NULL";
}
//This is where we set the query and update the available options
column.editorInstance.setStore(
column.editorInstance.store,
evt.cell.row.data[column.field],
{query:{client:evt.cell.row.data.client_id}}
);
//This is where we set editor value upon receipt of the results
when(column.editorInstance._queryRes, function() {
column.editorInstance.set(
'value',
evt.cell.row.data[column.field]
);
});
});
};
//Use the renderCell function to set the display value
column.renderCell = function(object, value, cell, options, header){
//add a class to distinguish this column
put(parent && parent.contents ? parent : cell, ".dgrid-select");
//for null values, we just put in an empty string
if (value == "NULL") put(cell, 'span.proposal', "");
else if (value) {
//otherwise delay til we have results
when(column.editorInstance._queryRes, function() {
//look for the display value in the editor
items = column.editorInstance.getOptions();
var found = false;
for (var i in items) {
//if we find the display value in the editor, cache it
if (value == items[i].value) {
found = true;
cache[value] = items[i].label;
value = items[i].label;
}
}
//if we don't find the display value in the editor,
//look for it in the cache
if (!found && cache[value]) value = cache[value];
//finally, populate the cell
put(cell, 'span.proposal', value);
});
}
};
//Set the editor args, mostly standard stuff
column.editorArgs = {
style:'width:100%',
labelAttr:'label',
sortByLabel:false,
store:sb.get(column.from, 'select'),
onSetStore:function(store, items) {
//if the field is not required, put in an empty options
//so the store doesn't have to include one
if (!this.required) {
this.options.unshift({label:' ', value:'NULL'});
this._loadChildren();
}
}
};
//create the editor
column = editor(column, Select, "dblclick");
//return the column
return column;
};
});