2015-01-16 3 views
0

Наша команда изучает и принимает Ember для создания наших приложений, и это было удивительное путешествие. Это дошло до того, что мне нужно постепенно получать данные с бесконечным списком прокрутки, который автоматически извлекает следующую страницу, как только пользователь прокручивается до самой нижней части списка. Наша конечная точка REST ожидает, что заголовок Range будет передан для этого, иначе он вернет max 1000 записей.Передача заголовка «Range» в Ember

До сих пор я обнаружил, что я могу указать заголовок в нашей модели конкретного класса адаптера, как показано на следующем:

App.TaskAdapter = DS.RESTAdapter.extend({ 
    headers: function() { 
     return { 
      'Range': 'items=0-9' 
     }; 
    } 
}); 

Поскольку диапазон должен изменяться в зависимости, на какой странице приложения необходимо загрузить следующий , я изменил класс быть похожим на это:

App.TaskAdapter = DS.RESTAdapter.extend({ 
    pageIndex: 0, 
    numRecords: 10, 

    headers: function() { 
     var pageIndex = this.get('pageIndex'); 
     var numRecords = this.get('numRecords'); 
     var rangeValue = 'items=' + (pageIndex * numRecords) + '-' + (((pageIndex + 1) * numRecords) - 1); 
     return { 
      'Range': rangeValue 
     }; 
    }.property().volatile() 
}); 

App.TasksRoute = Ember.Route.extend({ 
    ... 

    refreshModel: function(pageIndex) { 
     this.adapter.set('pageIndex', pageIndex); 
     this.store.find('task'); 
    }, 

    ... 
}); 

с этой модификации, я надеялся, что я мог бы изменить pageIndex и numRecords, делая это в пути (что привело меня к инъекции App.TaskAdapter в App.TasksRoute). Тем не менее, я обнаружил, что this.adapter.set('pageIndex', pageIndex); не устанавливает значение, как предполагалось, и это заставило меня думать, что адаптер создается (с фабрики?) Каждый раз, когда хранилище требуется для сбора данных. Возможно, я ошибаюсь.

Так как я не могу заставить это работать, у меня получился класс-помощник TaskAdapterConfig (который вводится в маршрут), чтобы сделать это.

App.TaskAdapter = DS.RESTAdapter.extend({ 
    pageIndex: 0, 
    numRecords: 10, 

    headers: function() { 
     var pageIndex = this.config.get('pageIndex'); 
     var numRecords = this.config.get('numRecords'); 
     var rangeValue = 'items=' + (pageIndex * numRecords) + '-' + (((pageIndex + 1) * numRecords) - 1); 
     return { 
      'Range': rangeValue 
     }; 
    }.property().volatile() 
}); 

App.TaskAdapterConfig = Ember.Object.extend({ 
    pageIndex: 0, 
    numRecords: 10 
}); 

App.TasksRoute = Ember.Route.extend({ 
    ... 

    refreshModel: function(pageIndex) { 
     this.adapterConfig.set('pageIndex', pageIndex); 
     this.store.find('task'); 
    }, 

    ... 
}); 

Мне интересно, есть ли лучший способ достичь этого?

ответ

0

Я не хватает репутации комментировать, поэтому, пожалуйста, простите ответ ...

Я могу подтвердить, что адаптер не инициализируется заново для каждого запроса.

Вы сказали, что проблема была с линией this.adapter.set('pageIndex', pageIndex);, и вы были бы правы. Это связано с тем, что приложение не имеет одного адаптера, как у него есть один магазин. Адаптеры могут быть прикладными (ApplicationAdapter) или специфичными для модели. Каждый раз, когда магазин получает вызов find(), он в конце концов ищет соответствующий адаптер для отправки вызова.

Таким образом, если вы используете адаптер приложения, вам необходимо либо указать конкретный адаптер (this.ApplicationAdapter.set()).

В качестве альтернативы, если вы используете адаптер модели, вы можете ссылаться на модель: this.store.adapterFor(type) где тип - это номер DS.Model, на который вы ссылаетесь. Чтобы получить модель программно, вы можете использовать this.modelFor('tasks'), который возвращает DS.Model.

Если ни один из вышеперечисленных методов не подходит для вашего приложения, вы можете хранить данные на внешнем классе, который вы можете надежно найти как с адаптера, так и с маршрутом, например, с конфигурационным объектом, который вы создаете в примере.

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