我的问题很简单,就在标题中!
这是我的代码:
userCreate: function(button) {
var grid = button.up('panel'),
store = grid.getStore();
/* Create new empty record */
var inst = store.add({})[0];
store.sync();
/* select the newly created record */
grid.getSelectionModel().select(inst.id);
Ext.create('GS.view.user.Edit', { create:true });
},
现在我只想要
之后的那一行 /* select the newly created record */
上班!
我尝试了很多东西,但没有一个能奏效:
grid.getSelectionModel().select(inst.id);
grid.getSelectionModel().select(inst);
grid.getSelectionModel().select(store.last);
有什么想法吗?
非常感谢
答案 0 :(得分:1)
来自docs .. select方法需要3个参数才能通过..
所以在你的情况下:
userCreate: function(button) {
var grid = button.up('panel');
store = grid.getStore();
/* Create new empty record */
var inst = store.add({})[0];
store.sync();
/* select the newly created record via model*/
grid.getSelectionModel().select(inst, true, true);
/* select the newly created record via view*/
grid.getView().select(inst, true, true);
Ext.create('GS.view.user.Edit', { create:true });
},
答案 1 :(得分:1)
这是我发现的:当没有“id”字段时,ExtJS似乎丢失了。
因此,在调用sync()
之后,如果您没有精确的“id”字段,它会重新组织网格,无法找到“旧”记录(我在电话会议之前记住的记录)。
这就是我的想法,我可能错了。
无论如何,我已经扭转了局面:保持“同质性”,我将xxxCreate()
和xxxCreateValidate()
,xxxUpdate()
和xxxUpdateValidate()
相同。我已经为例子做过:user => userCreate()
,userCreateValidate()
,userUpdate()
和userUpdateValidate()
:
init: function () {
this.control({
/* (!) Actions in 'userlist' */
'userlist': {
itemdblclick: this.userEdit
},
'userlist button[action=create]': {
click: this.userCreate
},
'userlist button[action=delete]': {
click: this.userDelete
},
/* (!) Actions in 'useredit' */
'useredit button[action=create]': {
click: this.userCreateValidate
},
'useredit button[action=save]': {
click: this.userEditValidate
}
});
},
userCreate: function(button) {
/* Using Ext.create() to pass variable create:true
* instead of the shortcut:
* var view = Ext.widget('useredit');
*/
var view = Ext.create('GS.view.user.Edit', {
create:true
});
},
userCreateValidate: function(button) {
var win = button.up('window'),
form = win.down('form'),
values = form.getValues();
this.getUsersStore().add(values);
this.getUsersStore().sync();
win.close();
},
userEdit: function(grid, record) {
var view = Ext.widget('useredit');
view.down('form').loadRecord(record);
},
userEditValidate: function (button) {
var win = button.up('window'),
form = win.down('form'),
record = form.getRecord(),
values = form.getValues();
record.set(values);
win.close();
this.getUsersStore().sync();
},
我希望我的代码可以帮助某人......现在我正在寻找一种方法来处理Grid中的键。就像ExtJS的所有内容一样:你没有花时间编码,因为一切都已经完成,你花时间 搜索 ......实际上它更令人沮丧=)< / p>
无论如何,最重要的是要注意新添加的记录是而不是。这只是一种继续发展的解决方法,但这不是我想要的(这不是我在问题中所要求的)。
答案 2 :(得分:0)
网格行选择通常在View对象中处理(在ExtJS 3中是GridView)。所以我想如果您更新上面的代码看起来像:
grid.getView()选择(0)。
这将选择索引0处的行,该行看起来就像您要添加新记录的位置。然后,View对象将通知选择模型并更新浏览器视图。您可以通过http://docs.sencha.com/ext-js/4-0/#/api/Ext.grid.View-method-select
上的API文档找到其他选择选项答案 3 :(得分:0)
使用grid.getSelectionModel().select(inst);
时的示例works fine。因此,导致此类行为的唯一因素是store.sync();
抛出异常。检查控制台输出是否有错误。
答案 4 :(得分:0)
我不知道是否有可能直接选择此记录,因为在同步之前,该记录是商店中的虚拟记录,但之后没有。另外,你可能会在服务器端(?)为它分配一个id,这会改变记录,并且在sync()之后它也不会相同......
如果记录中的某些字段是唯一的(例如名称或说明或任何内容),您可以使用它在同步后查找此记录并选择它:
var value = store.getAt(0).get('name'); // getting the value of a unique field e.g. "name" from the newly added record
store.sync();
var rec = store.findRecord("name", value); // find the record with the unique value "name" after sync
grid.getSelectionModel().select(rec); // select that record
答案 5 :(得分:0)
我认为这里的问题是你在调用store.sync();
后尝试选择记录,但这实际上是异步请求,它在从服务器获取数据后更新存储。
从服务器更新商店后尝试调用grid.getSelectionModel().select
。这种方法的问题是store.sync
不支持任何回调方法,但您应该能够在商店中使用datachanged
事件,这应该在商店同步全部完成后触发。
尝试这样的事情(基于您提供的有限代码示例):
userCreate: function(button) {
var grid = button.up('panel'),
store = grid.getStore();
/* Create new empty record */
var inst = store.add({})[0];
store.on('datachanged', function() {
/* select the newly created record, keep existing selection and
don't suppress events because grid view is updating upon this event
*/
grid.getSelectionModel().select(inst, true, false);
Ext.create('GS.view.user.Edit', { create:true });
});
store.sync();
},
答案 6 :(得分:-1)
你可以这样使用:
grid.getSelectionModel().select(store.data.length-1)