ExtJS:Ext.grid.Panel:如何在store.sync()之后保持排序顺序?

发布于 2024-12-04 21:48:43 字数 656 浏览 0 评论 0原文

我有一个很好用的 Ext.grid.Panel,其中的列标题可以单击进行“自动”排序。 商店有“autoSync:true”。 我有一个“新建”按钮,当用户单击它时,它会创建一个没有 id 属性的空记录:

onAddClick: function(){
    this.down('#new').setDisabled(true);
    var rec = new GroupeSynergies.data.Partenaire({
        /* Valeurs par défaut des colonnes */
        description: 'Nouveau partenaire'
    });
    this.store.insert(0, rec);
},

我将记录插入到 #0 位置,因为我知道它将是自动同步(这就是实际发生的情况)。 问题是:如果你点击“id”列,它会按id asc排序,如果你再次点击,则顺序相反。

然后单击“新建”按钮,它会创建空的新记录,将其发送到服务器,并获取 id 字段已完成的结果记录,更新网格,但是......不考虑排序:同步时,返回的 id 非常高,并且无论排序顺序如何,它都位于顶部。我做错了什么?

非常感谢

(PS,我在 stackoverflow 上询问,因为 Sencha 的论坛似乎人满为患)

I have a nice working Ext.grid.Panel, with column headers you can click on to "automatic" sort.
The store has "autoSync: true".
I have a button "new", when the user clicks on it, it creates an empty record without the id property:

onAddClick: function(){
    this.down('#new').setDisabled(true);
    var rec = new GroupeSynergies.data.Partenaire({
        /* Valeurs par défaut des colonnes */
        description: 'Nouveau partenaire'
    });
    this.store.insert(0, rec);
},

I insert the record in the #0 position, because I know that it'll be automatically synced (and that's what's happening actually).
The problem is: if you click on the "id" column, it's sorted by id asc, if you click again, reverse order.

Then you click on the button "New", it creates empty new record, sends it to the server, and gets the resulting record with the id field completed, updates the grid, but... don't take in account the sort: when it's synced, the returned id is very high and it stays on the top, no matter what the sort order is. What am I doing wrong?

Thank you very much

(PS I'm asking at stackoverflow because Sencha's forum seems to be overwhelmed)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

故事↓在人 2024-12-11 21:48:43

在类似的情况下,我找到的解决方案是在商店的“write”事件处理程序中添加 store.sort 。

Ext.application({

    (...)

    launch: function() {

        var myStore = this.getStore('myStore');
        myStore.on('write', function(store, operation){ store.sort('id','ASC') }; );

    }

});

根据您的需要调整排序参数。 文档 “排序”方法。

如果您在商店的代理上设置了writer,则排序也会触发简单的“更新”。为了避免这种情况,您可以测试 operation 参数的值。
文档 “写”事件。

我不知道这是否是更好的方法,这是我目前找到的唯一方法。

In a similar situation, the solution I've found is to add a store.sort in the 'write' event handler of the store.

Ext.application({

    (...)

    launch: function() {

        var myStore = this.getStore('myStore');
        myStore.on('write', function(store, operation){ store.sort('id','ASC') }; );

    }

});

Adapt the sorting parameter to your needs. Documentation for the 'sort' method.

If you have a writer set on the proxy of your store, the sorting will also fire for a simple "update". To avoid this situation you can test the value of the operation parameter.
Documentation for the 'write' event.

I don't know if it is the better way of doing it, it's the only one I've found for now.

哥,最终变帅啦 2024-12-11 21:48:43

这是另一个解决方案:

Ext.define('My.data.Store', {
    extend: 'Ext.data.Store',

    sortOnWrite: false,

    resort: function () {

        var me = this;

        me.doSort(me.generateComparator());
    },

    onProxyWrite: function (operation) {

        var me = this;

        if (me.sortOnWrite && operation.wasSuccessful()) {

            me.resort();
        }
    }
});

Here's another solution:

Ext.define('My.data.Store', {
    extend: 'Ext.data.Store',

    sortOnWrite: false,

    resort: function () {

        var me = this;

        me.doSort(me.generateComparator());
    },

    onProxyWrite: function (operation) {

        var me = this;

        if (me.sortOnWrite && operation.wasSuccessful()) {

            me.resort();
        }
    }
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文