Breeze クエリは、結果、実行されたクエリに関する情報、インライン カウント、および XHR を含むオブジェクトを返します。しかし、私が見た限りでは、OData サービスが複数のページでデータを返すように構成されている場合、nextLink はキャプチャされません。skip と take を使用してクエリを作成する代わりに、前のリクエストの結果を使用して nextLink にリクエストを送信する方法はありますか?
2 に答える
答えは、現時点ではサポートされていないということだと確信しています。おそらく @wardbell が協力してくれるでしょう。Breeze は OData を基になるサービス タイプとして "うまく" 動作するように設計されていますが、OData 仕様とそのすべての機能に完全に準拠することを意図したものではありません。実際には、サービスベースの CRUD パターンの標準化されたプロトコルとして OData を利用しているだけで、その上に乗ることができます。
しかし、サーバー側のページングは OData では重要なので、ある時点でそのサポートを追加できることを願っています。
MSDN の Supporting OData Query を見ると、
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options
サーバー ドリブン ページのトピックまで下にスクロールすると、コントローラーで Get を [Queryable(PageSize=10)] 属性で装飾すると、返される 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);
私が言ったように、私は応答でこのコードを書き、テストしていませんが、あなたのアプリに最適なものを判断するのに十分なものになるはずです.