4

店舗が併設されたグリッドを取得した単純なケースがあります。

2つのボタンがあります。選択したレコードを変更するハンドラーを備えたもの。選択したレコードをコミットするハンドラーを持つもの。

レコードを選択して[編集]->[編集]を押すと、選択が行われます(失われたようgrid.geSelectionModel().getSelection()に見えます)。電話をかけると、レコードがまだ選択されていることがわかります。それはそのようにそれを示していないだけです。

再度選択することはできません。最初に別のレコードを選択してから、レコードを選択し直す必要があります。

次に、レコードを選択してコミットボタンをクリックすると、値がコミットされますが、選択内容は「失われた」として再び表示されます。

これはバグですか?どうすればこれを修正できますか?選択範囲を表示したままにします。

これがフィドルです

サンプルコードは次のとおりです:(私はExt4.1.1を使用しています)

var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 1
    });

Ext.create('Ext.data.Store', {
    storeId: 'simpsonsStore',
    fields: ['name', 'email', 'phone'],
    data: {
        'items': [{
            'name': 'Lisa',
            "email": "lisa@simpsons.com",
            "phone": "555-111-1224"
        }, {
            'name': 'Bart',
            "email": "bart@simpsons.com",
            "phone": "555-222-1234"
        }, {
            'name': 'Homer',
            "email": "home@simpsons.com",
            "phone": "555-222-1244"
        }, {
            'name': 'Marge',
            "email": "marge@simpsons.com",
            "phone": "555-222-1254"
        }]
    },
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'items'
        }
    }
});

Ext.create('Ext.container.Container', {
    layout: 'fit',
    renderTo: Ext.getBody(),
    items: [{
        xtype: 'grid',
        store: Ext.data.StoreManager.lookup('simpsonsStore'),
        columns: [{
            text: 'Name',
            dataIndex: 'name'
        }, {
            text: 'Email',
            dataIndex: 'email',
            flex: 1
        }, {
            text: 'Phone',
            dataIndex: 'phone'
        }],
        height: 200,
        buttons: [{
            text: 'commit selection',
            handler: function(){
                this.up('grid').getSelectionModel().getSelection()[0].commit();
            }
        },{
            text: 'set selection name to maggy',
            handler: function(){
                this.up('grid').getSelectionModel().getSelection()[0].set('name', 'Maggy');
            }
        }]
    }]
});​

アップデート:

煎茶フォーラムで報告しました。Mitchel Simoensは、Ext4.1.2で修正されたと言っています。残念ながら、「サポートサブスクライバーのみ」のバージョンです。

アップデート:

問題を特定して修正しようとしています。この問題は、onUpdateメソッドのExt.view.Tableクラスにあると思います。より正確には、このコードの一部です。

if (oldRowDom.mergeAttributes) {
    oldRowDom.mergeAttributes(newRow, true);
} else {
    newAttrs = newRow.attributes;
    attLen = newAttrs.length;
    for (i = 0; i < attLen; i++) {
        attName = newAttrs[i].name;
        if (attName !== 'id') {
           oldRowDom.setAttribute(attName, newAttrs[i].value);
        }
    }
}

このコードをそのままにしておくのは悪い考えですか?コメントしましたが、現在は機能しているようですが、他の機能が損なわれることはありませんか?http://jsfiddle.net/Vandeplas/YZqch/10/

4

1 に答える 1

6

おそらくグリッドを更新してダーティビットを表示する一環として、バグだと思います。あなたの改訂されたフィドルで
、私はこれを醜い方法で回避しました:

{
    text: 'set selection name to maggy',
    handler: function(){
        var sel = this.up('grid').getSelectionModel();
        var rec = sel.getSelection()[0];
        rec.set('name', 'Maggy');
        sel.deselectAll();
        sel.select(rec.index);
    }
}

に対してこれを行いまし.set()たが、同じことができますcommit()

これが多少役立つことを願っています。

于 2012-10-04T14:00:45.857 に答える