如何在我的 Ext Store 上创建参数化的 Ext Rest Proxy
How to create parameterized Ext Rest Proxy on my Ext Store
我有一个 API 发送数据的分页结果,我希望我的 Ext JS 应用程序使用它,但我不知道如何提供所需的参数。
这是我期望的回复:
{
"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 商店,但我不知道如何传递 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 APIs,其中分页和过滤选项作为查询参数传入。 IE。像
https://localhost:44313/api/Rentals?start=1&limit=25
我建议使用这种方法而不是非标准的 REST API。它将使您能够无缝地使用Ext的相关功能。
如果无法更改 API 并且您需要坚持使用当前的服务器配置,那么您需要创建一个覆盖某些相关功能的自定义代理。最好的选择是覆盖 buildUrl 函数并将自定义生成的 URL 传递给请求对象。
更新
你可以从这段代码开始(也创建了一个Fiddle):
Ext.define('Yournamespace.proxy.custom', {
extend: 'Ext.data.proxy.Rest',
alias: 'proxy.custom',
buildUrl: function(request) {
const url = this.callParent([request]);
const operation = request.getOperation();
console.log(url, this.getParams(operation))
return url;
}
});
Ext.define('User', {
extend: 'Ext.data.Model',
});
Ext.application({
name : 'Fiddle',
launch : function() {
var myStore = Ext.create('Ext.data.Store', {
model: 'User',
pageSize: 10,
proxy: {
type: 'custom',
url: 'https://localhost:44313/api/Rentals/',
reader: {
type: 'json',
rootProperty: 'users'
}
},
autoLoad: true
});
}
});
您可以将自定义代码写入 buildUrl
函数。目前只有默认的 URL 和参数被收集并记录在那里,但它做的是默认的事情。您可以在此处调整 URL 并在最后调整 return 新的 URL。
我有一个 API 发送数据的分页结果,我希望我的 Ext JS 应用程序使用它,但我不知道如何提供所需的参数。
这是我期望的回复:
{
"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 商店,但我不知道如何传递 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 APIs,其中分页和过滤选项作为查询参数传入。 IE。像
https://localhost:44313/api/Rentals?start=1&limit=25
我建议使用这种方法而不是非标准的 REST API。它将使您能够无缝地使用Ext的相关功能。
如果无法更改 API 并且您需要坚持使用当前的服务器配置,那么您需要创建一个覆盖某些相关功能的自定义代理。最好的选择是覆盖 buildUrl 函数并将自定义生成的 URL 传递给请求对象。
更新
你可以从这段代码开始(也创建了一个Fiddle):
Ext.define('Yournamespace.proxy.custom', {
extend: 'Ext.data.proxy.Rest',
alias: 'proxy.custom',
buildUrl: function(request) {
const url = this.callParent([request]);
const operation = request.getOperation();
console.log(url, this.getParams(operation))
return url;
}
});
Ext.define('User', {
extend: 'Ext.data.Model',
});
Ext.application({
name : 'Fiddle',
launch : function() {
var myStore = Ext.create('Ext.data.Store', {
model: 'User',
pageSize: 10,
proxy: {
type: 'custom',
url: 'https://localhost:44313/api/Rentals/',
reader: {
type: 'json',
rootProperty: 'users'
}
},
autoLoad: true
});
}
});
您可以将自定义代码写入 buildUrl
函数。目前只有默认的 URL 和参数被收集并记录在那里,但它做的是默认的事情。您可以在此处调整 URL 并在最后调整 return 新的 URL。