Javascript extjs3.2。网格视图存储关联

Javascript extjs3.2。网格视图存储关联,javascript,model-view-controller,extjs,view,store,Javascript,Model View Controller,Extjs,View,Store,在我的示例中,在网格中记录数据的顺序如下: 添加所需数量的空记录 更改所需单元格中的值 为了只从服务器或整个表传输更改,这是必需的。 在某些情况下,可能没有更改,甚至可能删除某些数据。但主要观点是数据必须分两步改变。 问题在于,在调用呈现期间,数据重写可能在不同的时间发生。 在某些情况下,我们会有错误 //error store.insert(0, new Rec()); win.show(); store.insert(0, new Rec()); //no erro

在我的示例中,在网格中记录数据的顺序如下:

  • 添加所需数量的空记录
  • 更改所需单元格中的值
  • 为了只从服务器或整个表传输更改,这是必需的。 在某些情况下,可能没有更改,甚至可能删除某些数据。但主要观点是数据必须分两步改变。 问题在于,在调用呈现期间,数据重写可能在不同的时间发生。 在某些情况下,我们会有错误

    //error
    store.insert(0, new Rec());   
    win.show();         
    store.insert(0, new Rec());
    
    //no error
    store.insert(0, new Rec());     
    store.insert(0, new Rec());  
    win.show();         
    
    //no error
    win.show();         
    store.insert(0, new Rec());   
    store.insert(0, new Rec()); 
    
    我们不能保证insert和show函数的执行顺序,因为它们可以从不同的异步请求中调用

    我的问题在下面 为什么存储中的更改取决于视图状态,我们如何保护自己不受此影响


    在调用GridView的init()(这是从Grid的
    onRender()调用的)之前,GridView的存储“添加”事件侦听器似乎没有添加到视图中。渲染网格时会发生这种情况(win.show())。在#2(insert show)上没有出现错误,因为它从未命中
    Ext.fly(rows[0]).addClass(this.firstRowCls)processRows()
    中执行code>

    我稍微修改了代码,以打印GridViews init和onAdd(存储添加事件的处理程序)中的一些日志:

    以下是三种不同情况下的控制台:

    show-insert-insert
        init()
        1st insert
            adding: ext-record-1
        2nd insert
            adding: ext-record-2
        win.show()
    
    insert-show-insert
        1st insert
        win.show()
        init()
        2nd insert
            adding: ext-record-2
    
    Ext.fly(rows[0]) is null
    [Break On This Error]   
    Ext.fly(rows[0]).addClass(this.firstRowCls);
    ext-all-debug.js (line 43959
    
    insert-insert-show
        1st insert
        2nd insert
        win.show()
        init()
    
    正如您所看到的,它实际上将两个项目都添加到网格(和GridView)的唯一情况是在show insert案例中。到目前为止,我找到的最好的解决办法就是

    win.show();
    win.hide();
    

    一开始。到目前为止,我还没有找到更好的解决办法。我希望这有帮助。

    或者您可以在节目结束后刷新GridView

    win.show();
    grid.getView().refresh();
    
    win.show();
    grid.getView().refresh();