2013-12-03 3 views
0

Я использую ember.js (v1.2.0) с API, который возвращает JSON постраничного данные, как это:ember.js и API пагинация

{ 
    "count": 5, 
    "next": "http://127.0.0.1:8000/some/resource/?page=2", 
    "previous": null, 
    "results": [ 
     { 
      "id": 37, 
      "title": "Some title", 
      "description": "Some description", 
     }, 
     { 
      "id": 35, 
      "title": "Sdflskdf", 
      "description": "sdfkdsjf", 
     }, 
     { 
      "id": 34, 
      "title": "Some other title", 
      "description": "Dsdlfksdf", 
     }, 
    ] 
} 

Я не с использованием Ember-данных, поэтому я использую простой объект уголька в качестве моей модели и загрузок данных, как это:

App.SomeResource = Ember.Object.extend({}); 

App.SomeResource.reopenClass({ 
    find: function() { 
     return $.getJSON('/some/resource/').then(function (response) { 
      return response.results.map(function (data) { 
       return App.SomeResource.create(data); 
      }); 
     }); 
    }, 
}); 

метод находки на моем классе модели возвращает обещание, которое решает в массив объектов. При создании объектов SomeResource все данные разбиения на страницы теряются.

Есть ли способ хранить count, next и previous URL-адреса страниц где-то, когда обетование разрешается?

ответ

0

Вместо того, чтобы хранить эти метаданные на глобальном window объекта, я пришел с этим:

App.SomeResource.reopenClass({ 
    find: function() { 
     var url = '/some/resource/'; 
     return Ember.$.getJSON(url).then(function (response) { 
      response.results = response.results.map(function (resource) { 
       return App.SomeResource.create(resource); 
      }); 
      return response; 
     }); 
    }, 
}); 

SomeResource.find() только конкретизирует объекты Ember из массива результатов, а затем возвращает ответ с остальной частью данные нетронутые. Затем маршрут получает ответ и устанавливает данные нумерации страниц и модели в функции setupController:

App.SomeResourceRoute = Ember.Route.extend({ 
    model: function() { 
     return App.SomeResource.find(); 
    }, 

    setupController: function(controller, model) { 
     controller.setProperties({count: model.count, 
            pageCount: model.page_count, 
            currentPage: model.current_page, 
            pageRange: model.page_range, 
            previous: model.previous, 
            next: model.next, 
            model: model.results,}); 
    }, 
}); 

Он работает, но может быть, есть лучший путь.

0

Я назначаю их глобальному объекту, но вы должны делать лучше.

App.SomeResource = Ember.Object.extend({}); 

App.SomeResource.reopenClass({ 
    find: function() { 
     return $.getJSON('/some/resource/').then(function (response) { 
      return RSVP.all(response.results.map(function (data) { 
       return App.SomeResource.create(data); 
      })).then(function(createdResources) { 
       window.count = response.count; 
       window.next = response.next; 
       window.previous = response.previous; 
       return createdResources; 
      }); 
     }); 
    } 
}); 
+0

Кажется, что это работает, но если я разбиваю страницы на несколько моделей, это перепишет метаданные. – hso

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