Javascript 如何在我的Ext Store上创建参数化Ext Rest代理

Javascript 如何在我的Ext Store上创建参数化Ext Rest代理,javascript,rest,extjs,single-page-application,sencha-architect,Javascript,Rest,Extjs,Single Page Application,Sencha Architect,我有一个API,它发送一个分页的数据结果,我希望它被我的ExtJS应用程序使用,但我不知道如何提供所需的参数 以下是我预期的回应: { "currentPage": 1, "from": 1, "items": [ { "id": 1, "customer": "Customer 1", "movie"

我有一个API,它发送一个分页的数据结果,我希望它被我的ExtJS应用程序使用,但我不知道如何提供所需的参数

以下是我预期的回应:

{
  "currentPage": 1,
  "from": 1,
  "items": [
    {
      "id": 1,
      "customer": "Customer 1",
      "movie": "Movie 1",
      "dateRented": "2021-01-25T01:22:42.143",
      "dateReturned": "2021-01-25T01:22:50.447"
    },
    {
      "id": 2,
      "customer": "Customer 2",
      "movie": "Movie 2",
      "dateRented": "2021-01-25T01:22:42.15",
      "dateReturned": "2021-01-25T01:22:54.573"
    }
  ],
  "pageSize": 2,
  "to": 2,
  "totalCount": 1000003,
  "totalPages": 500002,
  "hasPreviousPage": false,
  "hasNextPage": true
}
以下是端点:

/api/Rentals/{currentPage}/{pageSize}
这是我的Ext store,但我不知道如何传递currentPage和pageSize的值:

Ext.define('Vidly.store.PagedRentals', {
    extend: 'Ext.data.Store',
    alias: 'store.pagedrentals',
    storeId: 'pagedrentals',
    model: 'Vidly.model.PagedRental',
    autoLoad: true,
    autoSync: true,
    proxy: {
        type: 'rest',
        url: 'https://localhost:44313/api/Rentals/',
        useDefaultXhrHeader: false,
        reader: {
            type: 'json',
            headers: { 'Accept': 'application/json' },
        },
        writer: {
            type: 'json',
            writeAllFields: true
        }
    },
});
以下是模型:

Ext.define('Vidly.model.PagedRental', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'currentPage', type: 'int' },
        { name: 'from', type: 'int' },
        { name: 'to', type: 'int' }, 
        { name: 'pageSize', type: 'int' },
        { name: 'totalCount', type: 'int' },
        { name: 'totalPages', type: 'int' },
        ],
    hasMany: 'Rental',
});

我希望有人能帮我解决我的问题。谢谢。

Ext的rest代理设计为使用标准rest API,其中分页和筛选选项作为查询参数传入。例如

https://localhost:44313/api/Rentals?start=1&limit=25

我建议使用这种方法,而不是非标准的RESTAPI。它将使您能够无缝地使用Ext的相关功能

如果无法更改API,并且需要坚持使用当前的服务器配置,则需要创建一个自定义代理来覆盖某些相关函数。如果您重写buildUrl函数并将自定义生成的URL传递给请求对象,那么这是最好的选择

更新

您可以从以下代码开始(也创建了):

Ext.define('Yournamespace.proxy.custom'{
扩展:“Ext.data.proxy.Rest”,
别名:“proxy.custom”,
buildUrl:函数(请求){
const url=this.callParent([request]);
const operation=request.getOperation();
console.log(url,this.getParams(操作))
返回url;
}
});
Ext.define('用户'{
扩展:“Ext.data.Model”,
});
外部应用程序({
名字:“小提琴”,
启动:函数(){
var myStore=Ext.create('Ext.data.Store'{
模型:“用户”,
页面大小:10,
代理:{
键入:“自定义”,
网址:'https://localhost:44313/api/Rentals/',
读者:{
键入:“json”,
rootProperty:'用户'
}
},
自动加载:正确
});
}
});

您可以将自定义代码写入
buildUrl
函数。目前只有默认的URL和参数被收集并记录在那里,但它做的是默认的东西。您可以在此处调整URL并在末尾返回新的URL。

查看beforeLoad方法并相应地更改URL。我应该将beforeLoad方法放在哪里?有没有可能实时更新参数?下一页、上一页或更改页面大小?可以使用buildUrl方法。您的模型有点奇怪,它必须包含id、customer、DateRendered和returnDate字段。。并且你的商店必须有rootProperty:“items”。。你检查过你的代码了吗?你可以在商店->监听器->加载前添加一个监听器。在回调函数中,您可以执行以下操作(store是该fn的第一个参数)->store.getProxy().getExtraParams()->modify->set and load。但是正如Arthur和Zoltan所提到的,我建议改进后端响应结构(模型)(如果可能的话)以及使用查询而不是pathparameters。这会让你的生活更轻松。事实上,我正在尝试学习多种场景下的ExtJS。是的,更改API可以解决我的问题,但如果遇到无法控制API的情况,该怎么办。这些都是我正在准备做的事情。您能告诉我如何使用自定义代理进行覆盖,以及如何在更改页面时从视图控制器调用它吗。我仍然是ExtJS的初学者,所以一个代码片段将非常有帮助。谢谢。我想这意味着无法更改API以使用正确的REST参数:)。我会在时间允许的情况下尽快更新我的答案。为您添加了一个覆盖buildUrl函数的示例。享受。:)我完全同意使用标准RESTAPI。你能告诉我如何用这个URL改变网页吗:从网格?我不确定我是否理解你的问题。请提供更多详情。