Я пытаюсь сортировать массив объектов модели на основе одной из связанных с ними моделей.Ember ждет отношений для загрузки в массиве с помощью ember concurrency
У меня есть документ который hasManyLINEITEM и LINEITEMbelongsTo в Расположение. Я хочу сортировать позиции по их местоположению. Так что, если я что-то вроде этого:
let lineItems = [
{
itemName: "One",
location: {
name: "Kitchen"
}
},
{
itemName: "Two",
location: {
name: "Kitchen"
}
},
{
itemName: "Three",
location: {
name: "Bathroom"
}
},
{
itemName: "Four",
location: {
name: "Bathroom"
}
},
{
itemName: "Five",
location: {
name: "Hall"
}
},
{
itemName: "Six",
location: {
name: "Hall"
}
}
];
Я хочу, чтобы добраться до:
let groupedLineItems = {
"Kitchen": [
{
itemName: "One",
location: "Kitchen"
},
{
itemName: "Two",
location: "Kitchen"
},
],
"Bathroom": [
{
itemName: "Three",
location: "Bathroom"
},
{
itemName: "Four",
location: "Bathroom"
},
],
"Hall": [
{
itemName: "Five",
location: "Hall"
},
{
itemName: "Six",
location: "Hall"
}
]
}
Я понял, как сортировать, но только один раз все отношения загружены. Я не могу понять, как использовать параллелизм ember, чтобы дождаться загрузки всех отношений до сортировки данных.
Это мой контроллер:
~/app/controllers/document.js
import Ember from 'ember';
import _ from 'underscore';
import { task } from 'ember-concurrency';
const { computed } = Ember;
export default Ember.Controller.extend({
init() {
this.get('myTask').perform();
},
myTask: task(function *() {
// Wait for locations to resolve.
let lineItems = this.get('model').get('lineItems');
yield this.get("secondTask").perform(lineItems);
let groupedLineItems = yield _.groupBy(lineItems.toArray(), (lineItem) => {
lineItem.get('location').then((location) => {
return location.get('name');
});
});
this.set("groupedLineItems2", Ember.Object.create(groupedLineItems));
}),
secondTask: task(function * (lineItems) {
yield lineItems.toArray().forEach((lineItem) => {
lineItem.get('location');
});
})
});
Это WIP на контроллере и не правильно. При запуске запускается первая задача, но не дожидаются загрузки местоположений для каждой позиции. Я пытаюсь заставить его загрузить все места во второй задаче, но явно не подходит для этого. Следовательно, при инициализации он будет выполняться путем сортировки, но функция для _.groupBy вернется не определена, потому что в этой точке местоположение не определено. Затем, если я снова запустил задачу вручную (используя кнопку в шаблоне) после того, как я узнаю, что места загружены (потому что я использую их в другом месте в шаблоне), он работает нормально.
Решение не должно использовать параллелизм ember, это просто казалось правильным инструментом, но я думаю, что это можно сделать и с обещаниями.
Это не «сортировка». –