2013-10-25 4 views
2
.

. Запросы Breeze возвращают объект, содержащий результаты, информацию о запросе, номер строки и XHR. Но, насколько я видел, nextLink не фиксируется, когда служба OData настроена на возврат данных на нескольких страницах. Есть ли способ отправить запрос nextLink, используя результат предыдущего запроса, вместо создания запроса с помощью пропустить и принять?Использование Breeze с поддержкой подкачки на стороне сервера. Услуги OData.

ответ

2

Я уверен, что ответ заключается в том, что он не поддерживает это в настоящее время. Возможно, @wardbell может перезвонить. В то время как Breeze разработан, чтобы работать «хорошо» с OData как базовым типом сервиса, он не должен полностью соответствовать спецификации OData и всем ее функциям. Это действительно просто использование OData в качестве стандартизованного протокола для основанных на сервисах шаблонов CRUD, которые он может использовать на вершине.

Но подкачка на стороне сервера важна в OData, поэтому, надеюсь, они могут добавить поддержку для этого в какой-то момент.

0

Если посмотреть на Поддерживающие OData запрос на MSDN

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

Прокрутка вниз к серверу Driven Страницы тему, и вы увидите, что если вы украшаете свой Приобретайте в контроллере с [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); 

Как я уже сказал, я написал этот код в ответ и не проверял, но это должно дать вам достаточно, чтобы определить самое лучшее для вашего приложения.

+1

Спасибо за все усилия. Я только начал играть с Breeze и хочу знать, есть ли встроенная поддержка обработки серверного подкачки. Как заявил Брайан Нойс, нет встроенной поддержки. Поэтому мы должны обрабатывать вещи вручную. Я понял подход, который вы пробовали здесь, я обязательно попробую. Я хотел бы знать, планирует ли команда Бриз включить эту функцию в свою будущую версию. –

Смежные вопросы