背景:根据业务需求,需要在grid里面加载很多数据,再根据每条数据的某个属性确定该条数据是否被选中。
过程:google了一下,发现一个老外提供了下面的方法。
Ext.Ajax.request({ method: ‘POST‘, url:‘index.php/mapper/get_tag_subfields/‘, scope: this, params : { id:this.gridB.getSelectionModel().getSelection()[0].data.id, }, success: function(xhr){ var json =Ext.decode(xhr.responseText); // make sure to decode for loadData to work // data is formatted, just needto load data storeMapperSubfields.loadData(json.data); // mark checkboxes if(json.data.length){ for (var i = 0; i <json.data.length; i++){ var rec =this.gridC.store.getById(json.data[i].id); // json.data[i].getId() if(rec.data.field_type == ‘s‘){ // select all records have have ‘s‘ this.gridC.getSelectionModel().select(rec,true,false); } } } }, failure: function() { Ext.getBody().unmask(); alert(‘AJAX FAILURE: Unableto process call‘); } }); }, this);
但是我用的时候红线部分报错。说views[0]找不到。
下面是我的代码:
Ext.Ajax.request( { url : ‘/aaaaaaaaaaa/bbbbbbbbbbbbbbb.do‘, method : ‘post‘, params : { methodName:‘aaaaaaaaaaa‘, policyid:policyid, appid:appid }, success : function(response, options) { var result = Ext.JSON.decode(response.responseText); var editTitle=‘采集策略‘+policyName+‘操作请求修改‘; var editPolicyPanelOpers = new PM.view.policy.PolicyEditOpers({ title: editTitle//, //data: result.data }); //设置policyid Ext.ComponentQuery.query(‘window#policyeditopers textfield#selectPolicyid‘)[0].setValue(policyid); Ext.ComponentQuery.query(‘window#policyeditopers textfield#selectAppid‘)[0].setValue(appid); var operGrid = Ext.ComponentQuery.query(‘window#policyeditopers grid#oper_grid‘)[0]; var opersStore = Ext.getStore(‘BusinessOperStore‘); if("undefined" != typeof opersStore) { opersStore.loadData(result.data); operGrid.reconfigure(opersStore); for (var i = 0; i < result.data.length; i++){ var rec = operGrid.store.getById(result.data[i].businessoperid); // json.data[i].getId() if (rec.data.selected == true){ // select all records have have ‘s‘ operGrid.getSelectionModel().select(rec,true,false); } } } //设置appid editPolicyPanelOpers.show(); }, failure : function() { var o = Ext.JSON.decode(response.responseText); // alert(o.msg); Ext.Msg.alert(‘提示信息‘,o.message); } });
查阅了select(rec,true,false)的方法。说rec这个参数要么是index,要么是record的实例。
询问同时,他说是渲染的问题。说我调用的地方不对。
接着就是自己瞎折腾:查阅了源代码,发现属性selected为私有。不能通过它设置选中与否。
几个小时过去后,又想到同事的话。
最后自己耐心地去实践了一下。果然是这个问题。这个问题解决了,但花去了一下午加一晚上的时间。
下面是代码片段:
init:function(){ this.control({ ‘policyeditopers grid#oper_grid‘:{ afterrender:this.selectModel } }); }, selectModel:function(){ Ext.Msg.alert(‘selectModel‘,‘test‘); var operGrid = Ext.ComponentQuery.query(‘window#policyeditopers grid#oper_grid‘)[0]; for (var i = 0; i < operGrid.getSelectionModel().store.data.items.length; i++){ var rec = operGrid.store.getById(operGrid.getSelectionModel().store.data.items[i].data.businessoperid); // json.data[i].getId() if (rec.data.selected == true){ // select all records have have ‘s‘ operGrid.getSelectionModel().select(rec,true,false); } } }