ExtJS - 如何在同步商店时传递 ID?

ExtJS - How do I pass ID when syncing store?

在 ExtJS 6.2 上,我像这样从数据库中获取数据:myStore.load({id: myId);

如何在同步时传递 ID? 这不起作用:myStore.sync({id: myId);

我正在使用 REST 代理,我的 URL 格式如下:mydomain/users/1

您可以简单地使用myStore.sync(),不需要指定idsync 函数将检查存储内容,并根据需要 add/delete/update 记录。

使用 REST 时,您可以将 Ext.data.write.WriterwriteRecordId(参见 here)设置为 false,因为使用 REST id 通常附加到URL,如您的情况。

我通过扩展 Ext.data.proxy.Rest 并覆盖 buildUrl 方法来解决问题,以便能够从请求参数中提取 ID。然后我在我的模型中使用了这个覆盖的代理:

Ext.define('MYPROJ.proxy.Settings', {
   extend : 'Ext.data.proxy.Rest',
   alias  : 'proxy.settings',
   buildUrl(request) {
      const url = this.callParent([request]);
      const id  = request.getParams().id;

      if (id) {
         delete request.getParams().id;

         const proxyUrl = request.getProxy().getUrl();

         return url.replace(proxyUrl, `${proxyUrl}/${id}`);
      }

      return url;
   }
});

Ext.define('MYPROJ.model.Setting', {
   extend  : 'Ext.data.Model',
   alias   : 'model.setting',

   clientIdProperty: 'clientId',

   fields: [{
      name    : 'id',
      type    : 'int',
      persist : false
   }, {
      name   : 'name',
      type   : 'string',
      unique : true
   }],

   proxy: {
      type : 'settings', // <- Use overridden proxy here
      url  : `/something/settings`
   }
});

然后在我的代码中我可以像这样使用 sync()

const myID = 10;

this.settingsStore.load({id: myID});

//...

this.settingsStore.sync({params: {id: myID}});

sync() 被调用时 myID 将从 MYPROJ.proxy.Settings 上的参数中提取并添加到 URL (/something/settings/10).