Ember.js сортировка и фильтрация дочерних элементов отношения hasMany в родительском маршруте
Обновление № 2
Я обнаружил, что когда я реорганизовал логику фильтрации, чтобы она выполнялась в составном вычисляемом свойстве в PostController, а не в отдельных маршрутах, я смог заставить его работать. В конечном итоге решение зависело от единственной динамической переменной, заданной конкретным действием маршрута #linkTo, которое вызвало изменения фильтрации в вычисляемом свойстве PostController. У меня много работы, чтобы наверстать упущенное, поэтому я не могу опубликовать решение этого конкретного вопроса сейчас, но когда смогу, я подробно опишу решение ниже. На данный момент я пометил ответ @ twinturbo как правильный для частичного, но невероятно полезного руководства, которое он дал ниже. Еще раз спасибо, человек! Очень признателен!!
Обновление № 1
Последняя скрипка наhttp://jsfiddle.net/aZNRu/14/ с помощью @ twinturbo работает сортировка атрибута «rank» Комментариев в родительском контроллере Post вместе с базовой фильтрацией. Проблема с автоматическим обновлением представлений по-прежнему возникает при фильтрации по маршруту и создании нового комментария.
Оригинальный вопрос
я вижу эторечь идет о сочетании сортируемого миксина с фильтрацией, но пока, как вы можете видеть в моемпример jsfiddleУ меня проблемы с сортировкой и фильтрацией:
1) Я не могу понять, как сортировать по определенному дочернему атрибуту в контроллере его родителя. Если мы имеем:
App.Post = DS.Model.extend({
title: DS.attr('string'),
post: DS.attr('string'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('App.Post'),
description: DS.attr('string'),
isActive: DS.attr('boolean'),
rank: DS.attr('number')
});
App.Router.map(function() {
this.resource("posts", { path: "/" }, function() {
this.resource('post', { path: ':post_id' }, function() {
this.route('active');
this.route('inactive');
});
});
});
Я хочу иметь возможность сортировать комментарии каждого поста в порядке возрастания по его атрибуту "rank". Я хочу сделать что-то вроде:
App.PostController = Ember.ObjectController.extend({
sortProperties: ['comments.rank']
но, с одной стороны, я думаю, что sortProperties работает только на arrayControllers, и я не думаю, что он может работать более чем на один уровень. Как я мог этого добиться?
2) Вторая проблема - не получить автоматически обновляемые представления при отфильтрованном маршруте. Например, если вы просматриваете jsfiddle и переходите к активному отфильтрованному маршруту, нажимая «Активные комментарии», вы получаете хороший эффект фильтрации текущих данных. Но если вы остаетесь в активном маршруте и создаете новую активную запись, нажимая «Добавить новый комментарий», запись не отображается автоматически в «Активном», а появляется только в том случае, если вы щелкнете по другому маршруту и вернетесь к нему.
Я неправильно настраиваю фильтрацию маршрута в маршруте или неправильно указываю в шаблоне?
App.PostActiveRoute = Ember.Route.extend({
setupController: function() {
var post = this.controllerFor('post').get('model'),
comments = post.get('comments');
var activeComments = comments.filter(function(comment) {
if (comment.get('isActive')) { return true; }
});
this.controllerFor('post').set('filteredComments', activeComments);
}
});
<ul>
{{#each comment in filteredComments}}
<li>{{comment.rank}} {{comment.description}} - isActive: {{comment.isActive}}</li>
{{/each}}
</ul>
Будем очень благодарны за любые идеи, которые вы можете дать по этим вопросам!