日期:2014-05-16  浏览次数:20403 次

ext4关于store更新的经典疑难问题
先看代码再说明:
JScript code

                {
                            xtype: "boundlist",
                            id: "test",
                            height: 413,
                            deferInitialRefresh: false,
                            autoScroll: true,
                            displayField: 'name',
                            valueField: 'id',
                            //store: testStore
                            store: Ext.create('Ext.data.Store',{
                                fields: ['id', 'name'],
                                data: [{id: "1", name: "name1"}, {id: "2", name: "name2"}]
                            })
                }


以上显示正常,为两条记录,
现在,我点一个按钮,改变了此对象的store,并更新,但却无效,代码如下:
var test = Ext.getCmp("test");
var newStore = Ext.create('Ext.data.Store',{
fields: ['id', 'name'],
data: [{id: "3", name: "name3"}, {id: "4", name: "name4"}]
});
test.store = newStore;//值正常
test.store.load();//无效更新列表,怎么回事呢?我改为test.store.reload();也无效,请高人指教

------解决方案--------------------
不是这么用的 
store有个方法叫做insert

insert( Number index, Ext.data.Model[] records )
Inserts Model instances into the Store at the given index and fires the add event. See also add.

Parameters
index : Number
The start index at which to insert the passed Records.
records : Ext.data.Model[]
An Array of Ext.data.Model objects to add to the store.
------解决方案--------------------
直接插一条进去 这个这是本地内存改变了 你还要更新至服务器端的数据库
------解决方案--------------------
调用doLayout更新视图
test.doLayout();
------解决方案--------------------
还有更新store的方式有问题,你那样直接构造一个新store的方式不是更新,是把store重新赋值了都,store属性这样直接写入当然并不能带来更新,你要知道,js里面是不支持属性的读写逻辑的,所以写入一个属性绝对不会带来视图上的任何更新,并需调用函数才可能更新视图.
你用更新store的record的方式更新数据源,不要构造新的store,更换了store的record后调用doLayout,就可以更新了
------解决方案--------------------
正在学习extjs4中..
------解决方案--------------------
store.getAt(i).set("name", "newname");

楼主这里的为什么要先getAt()呢,直接set('','')这样行吗?如果可行getAt()记录数的问题就不存在了,
6楼不是说最好构建一个record,然后替换掉..可以试试啊
------解决方案--------------------
更改record的方式是不会错的,
store实际是一个集合,可以添加成员和移除成员,该集合提供的操作方法是很完备的:
移除成员:remove、removeAt,removeAll
添加成员:add,insert
所以你说的新的记录数与原记录数不等时就没法处理的说法是莫名其妙的,
你先用removeAll移除所有record,再用add方法把新的record一添加进去就行了
这种小问题无需操作dom
------解决方案--------------------
毛,更改store的情况做ext时用的多了,从没说没法更新的,
移除原有记录,添加新纪录的方式绝不会有问题

实在不行,把显示grid的代码写成一个函数,需要更新时关闭原grid(从其容器组件中移除该对象就行了)对象,调用函数重新生成一个grid也就是了(不过这种方法记得调用其容器组件的doLayout),从没见被更新问题给拦着就不知所措的,
方法都是想出来的,多想想,哪有解决不了的问题
------解决方案--------------------
ext的控件和数据源绑定了的,只要修改对应的store,会自动更新ext的控件
------解决方案--------------------
看了你给的网址了,我感觉我先前的都白说了,
你都把store重新赋值了,操作的根本就不是原来的store对象了,你还指望更新?
"不要构造新的store",这一楼的回答不知你怎么理解的,看到你还是重新构造了一个store代替了原来的......
被重新赋值后,test.store已经不是配置时产生的那个store了,明白么?你对test.store做的任何操作都不会作用在原来的store上,所以是无法产生作用的。先把这个问题搞清楚吧
------解决方案--------------------