Breeze查询返回一个包含结果的对象,有关查询的信息,内联计数和XHR。但据我所知,当OData服务配置为在多个页面中返回数据时,不会捕获nextLink。有没有办法使用先前请求的结果向nextLink发送请求,而不是使用skip和take创建查询?
答案 0 :(得分:2)
我很确定答案是它目前不支持。也许@wardbell可以插入。虽然Breeze设计为与OData作为底层服务类型“很好”工作,但它并不意味着与OData规范及其所有功能完全一致。它实际上只是利用OData作为基于服务的CRUD模式的标准化协议,它可以在其上运行。
但是服务器端分页在OData中很重要,所以希望他们可以在某些时候添加对它的支持。
答案 1 :(得分:0)
如果你看一下MSDN上的支持OData查询
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options
向下滚动到“服务器驱动页面”主题,您将看到如果使用[Queryable(PageSize = 10)]属性修饰控件中的Get,则返回的JSON包含
[Queryable(PageSize=10)]
public IQueryable<Product> Get()
{
return products.AsQueryable();
}
返回
{
"odata.metadata":"http://localhost/$metadata#Products",
"value":[
{ "ID":1,"Name":"Hat","Price":"15","Category":"Apparel" },
{ "ID":2,"Name":"Socks","Price":"5","Category":"Apparel" },
// Others not shown
],
"odata.nextLink":"http://localhost/Products?$skip=10"
}
您应该可以使用它来获取下一页。在页面上的dataservice.js中,从您的调用返回的结果是JSON。
您应该能够在查询参数中使用.skip。
var getProducts = function (callback) {
// get pageNumber from the viewModel
var pageNumber = window.app.vm.Products.pageNumber();
// ditto pageSize
var pageSize = window.app.vm.Products.pageSize ();
// set up your query
var query4 = EntityQuery.from("Products")
.orderBy("ProductName")
.skip(pageNumber * pageSize)
.take(pageSize);
}
// execute the query returning the promise from breeze and q
// when the promise resolves, get the data and act on it
return manager.executeQuery(query4)
.then(function (data) {
// set your viewModel ko.observableArray to the returned items
window.app.vm.products.products(data.odata.value);
// set your viewModel ko.observable to the pageNumber window.app.vm.products.pageNumber(data.odata.nextlink.substring(indexOf("skip=") + 1) / pageSize);
})
.fail(queryFailed);
我刚刚编写了这个代码,因此您需要在浏览器F12和dataservice.js中检查返回的数据,以确保正确解析跳过值。我的代码很容易出错,因为我没有在SPA中分页数据。我只是建议这是一种方法。
在我的viewModel.activate()方法中,我会做这样的事情。
app.vm.products = (function ($, ko, dataservice, router) {
var products = ko.observableArray();
var pageNumber = ko.observable(1);
var pageSize = ko.observable(10);
var initialized = false; // private
var activate = function (routeData, callback) {
if (initialized) {
return;
}
initialized = true;
dataservice.getProducts();
// I do not think you will have an async timing issue here because the
// get of the pageNumber happens before the ajax call
// which would be the major source of latency.
// If you run into a problem with it updating too quickly you can start with
// page number 0, or put the increment in a callback from the dataservice
// method.
pageNumber(pageNumber() + pageSize);
},
...
return {
activate: activate,
products: products
};
})($, ko, app.dataservice, app.router);
就像我说的那样,我在响应中编写了这段代码并且没有对其进行测试,但它应该足以为您的应用确定最佳代码。