Я изо всех сил пытаюсь выполнить обещанные данные Сервиса в Маршруте. Проблема возникает, когда я перехожу к Маршруту в приложении init; то есть, если я загружаю приложение, то переход, все в порядке, потому что обещание уже выполнено, но если я удалю перезагрузку браузера на этом маршруте, строки нарушения не будут выполняться. Служба:Доступ к обещанию услуги с маршрута
// services/lime-core.js
import Ember from 'ember';
export default Ember.Service.extend({
store: Ember.inject.service(),
resources: null,
init() {
this.set('resources', []);
this.get('store').findAll('resource').then(resources => {
this.set('resources', resources);
});
}
});
Эта услуга прекрасно работает в шаблоне, предполагая, что я ввел услугу в компонент. Я эту службу в маршрут следующим образом: (предположим, что slug
имеет значимую величину)
// dashboard/route.js
export default Ember.Route.extend({
limeCore: Ember.service.inject(),
...
model(params) {
...
this.set('resource', this.get('limeCore.resources').findBy('slug', slug));
...
}
}
Когда model()
хук вызывается, init()
метод в limeCore
сервиса все еще ждет обещание выполнить. Я пытался быть умным, но изменить код, чтобы что-то вроде:
this.get('limeCore.resources').then(resources => {
this.set('resource', resources.findBy('slug', slug))
});
не работает, потому что this.get('limeCore.resources')
не возвращает Promise. Эта логика должна быть в маршруте (т. Е. Не может быть перемещена в шаблон), потому что я зависим от значения slug, чтобы определить идентификатор, который загружает другой набор данных ember.
Опять же, этот код работает правильно, как только обещание выполнено, то есть при дальнейшем переходе на этот маршрут, но не при загрузке первоначального приложения.
Я уверен, что есть правильный способ сделать это ... либо Служба должна вернуть обещание (хотя оно еще можно использовать в шаблонах), либо мне нужно убедиться, что обещание выполнено до Route.model()
метод может быть выполнен.
Спасибо!
Хотя я не пробовал еще (это немного поздно здесь), я не уверен, что этот подход будет работать. Результат метода 'model()' моего маршрута зависит от идентификатора ресурса: 'return this.store.query ('artifact', {'resource-id': resource.id})'. Как метод 'model()' возвращает этот последующий запрос, если он работает в блоке 'then()'? – pauldoerwald
Добавленное решение для вашей проблемы, вопрос никогда не утверждал, что вы столкнулись с такой проблемой. –
Надеюсь, вы сможете создать свой ответ на основе моего. Не могу на самом деле сказать твою точную утику + –