存储中的对象更改时 ExtJS 刷新网格

ExtJS refresh grid when object in store is changed

我有一个包含对象的商店,我有这个商店的视图模型,我有一个网格,其中的商店绑定到这个视图模型商店。

示例:(在我的例子中,对象要复杂得多)

const things = {car: 'Fiat', house: 'big'};

   Ext.define('MyApp.store.users', {
      extend  : 'Ext.data.Store',
      model   : 'MyApp.model.users',
      alias   : 'store.users',
      data    : [{
          name: 'john',
          things: things
      }]
   });

Ext.define('MyApp.model.users', {
   extend  : 'Ext.data.Model',
   alias   : 'model.users',
   fields: [{
      name : 'name'
   }, {
      name : 'things',
      type : 'boolean',
      calculate(d) { return isHouseBig(d.house) }
   }],
   proxy: {
      type : 'localstorage',
      id   : 'usb-devices'
   }
});

things.car = 'Ferrari';

那么,当我更改 house 的值时如何让我的网格更新?

ExtJS 会在存储更改时自动刷新网格。这里的问题是,当数据作为 JSON 对象 check documentation here 出现时,您在模型定义中使用了 mapping。当您像这样设置字段时,如果您修改商店数据,网格将自动反映更改。

检查下面的代码,最后注释掉这两行,看看它们执行时的区别。您可以找到这个简化示例 here as a working fiddle.

Ext.define('MyApp.model.users', {
   extend  : 'Ext.data.Model',
   fields: [{
      name : 'name'
   },{
      name : 'things',
   },{
      name : 'car',
      // so in every model `car` will represent `things.car`
      mapping : 'things.car',
   },{
      name : 'house',
      mapping : 'things.house',
   }],
});

Ext.define('MyApp.store.users', {
    extend  : 'Ext.data.Store',
    model   : 'MyApp.model.users',
    data    : [{
      name: 'john',
      things: {car: 'Fiat', house: 'big'}
    },{
      name: 'mary',
      things: {car: 'Opel', house: 'small'}
    }],
    proxy: {
      type: 'memory'
    }
});

const usersStore = Ext.create('MyApp.store.users');

const usersGrid = Ext.create({
    xtype: 'grid',
    renderTo: Ext.getBody(),
    store: usersStore,
    width: 400,
    height: 200,
    title: 'Users',
    columns: [{
        text: 'name',
        dataIndex: 'name'
    },{
        text: 'car',
        dataIndex: 'car'
    },{
        text: 'house',
        dataIndex: 'house'
    }]
});

// uncomment these lines to see change

//usersStore.getAt(1).set('car', 'newCar');
//usersStore.getAt(1).set('house', 'newHouse');