ember.js - data - ember serializer
Ember.js ordena y filtra hijos de una relaciĆ³n hasMany en la ruta principal (3)
Actualización # 2
Descubrí que cuando reformulé la lógica de filtrado para que tuviera lugar en una propiedad compuesta compilada dentro del PostController en lugar de hacerlo en rutas individuales, pude hacerlo funcionar. La solución dependía en última instancia de una única variable dinámica establecida por la acción específica #linkTo route que activaba los cambios de filtrado dentro de una propiedad calculada por PostController. Tengo mucho trabajo para ponerme al día, así que no puedo publicar la solución a esta pregunta específica ahora, pero cuando pueda, detallaré una explicación de la solución a continuación. Por ahora, he marcado la respuesta de @ twinturbo como correcta para la orientación parcial pero increíblemente útil que dio a continuación. Gracias otra vez hombre !! ¡¡Muy apreciado!!
Actualización # 1
El último violín está en http://jsfiddle.net/aZNRu/14/ con la ayuda de @ twinturbo, ordenando el atributo "rango" de los Comentarios en su controlador Post padre, junto con el filtrado básico. Todavía tiene el problema de no obtener vistas de actualización automática cuando se encuentra en una ruta filtrada y se crea un nuevo comentario.
Pregunta original
Veo que se habla de combinar la mezcla ordenable con la funcionalidad de filtrado , pero por ahora, como puede ver en mi ejemplo de jsfiddle , tengo problemas con la clasificación y el filtrado:
1) No puedo descifrar cómo ordenar por un atributo hijo específico en el controlador de su padre. Si tenemos:
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'');
});
});
});
Quiero poder ordenar los comentarios de cada publicación en orden ascendente por su atributo de "rango". Quiero hacer algo como:
App.PostController = Ember.ObjectController.extend({
sortProperties: [''comments.rank'']
pero, para empezar, creo que sortProperties solo funciona en arrayControllers, y no creo que pueda funcionar a más de un nivel. ¿Cómo podría lograr esto?
2) El segundo problema no es obtener vistas de actualización automática en una ruta filtrada. Por ejemplo, si ve el jsfiddle y entra en la ruta filtrada activa al hacer clic en "Comentarios activos" obtendrá un buen efecto de filtrado en los datos actuales. Pero si permanece en la ruta activa y crea un nuevo registro que está activo haciendo clic en "Agregar nuevo comentario", el registro no se representa automáticamente en "Activo" y solo aparece si hace clic en otra ruta y luego vuelve a ella.
¿Estoy configurando la ruta que se filtra incorrectamente en la ruta o que hace una referencia incorrecta en la plantilla?
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>
¡Cualquier comentario que pueda dar sobre estos temas sería muy apreciado!
pero, para empezar, creo que sortProperties solo funciona en arrayControllers, y no creo que pueda funcionar a más de un nivel. ¿Cómo podría lograr esto?
Tiene razón en que sortProperties solo funciona en Ember.ArrayController
.
Realmente no necesitas hacer nada elegante para lograr esto. Simplemente ajuste el conjunto de comentarios en un nuevo ArrayProxy
que incluya la ArrayProxy
ordenable. Luego puedes ordenar los comentarios. Entonces no necesita una propiedad de nido porque está ordenando una matriz de comentarios.
Por favor, no extienda DS.ManyArray
. No hay necesidad de eso.
En cuanto a la clasificación y el filtrado, debe usar la composición aquí. Eso significa crear algo como contenido filteredContent
y contenido sortedContent
. Entonces puede tener sortedContent
use filteredContent
.
Actualizar:
PostController = Ember.ObjectController.extend({
comments: (function() {
return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
sortProperties: [''rank''],
content: this.get(''content.comments'')
});
}).property(''content.comments'')
¿Quizás pueda hacer que sus matrices múltiples se puedan ordenar extendiendo la tienda y agregando la mezcla ordenable en el método createManyArray? (No probé si funciona)
App.store = DS.Store.create({
createManyArray: function (type, clientIds) {
var array = DS.ManyArray.create(Ember.SortableMixin, { type: type, content: clientIds, store: this });
clientIds.forEach(function (clientId) {
var recordArrays = this.recordArraysForClientId(clientId);
recordArrays.add(array);
}, this);
return array;
}
});
entonces puedes unir al contenido arreglado de la matriz
{#each comment in filteredComments.arrangedContent}}
Esto se puede hacer con una macro de propiedad calculada también.
PostController = Ember.ObjectController.extend({
commentSortProperties: [''rank:desc'', ''createdAt:asc''],
comments: Em.computed.sort(''model.comments'', ''commentSortProperties'')
});