2012-09-22 19 views
8

Me gustaría poder ordenar un ArrayController cuyo contenido surge de una consulta de datos de color ámbar. Desafortunadamente, la mixin sortProperty no parece funcionar en este caso.Ordenando un ArrayController respaldado por Ember-Data mediante sortProperty mixin

Me gustaría ser capaz de hacer lo siguiente:

App = Ember.Application.create(); 
App.store = DS.Store.create({ revision: 4}); 

App.Item = DS.Model.extend({ 
    id: DS.attr('string'), 
    name: DS.attr('string') 
}); 

App.store.createRecord(App.Item, {id: '4', name: 'banana' }); 
App.store.createRecord(App.Item, {id: '2', name: 'apple'}); 
App.store.createRecord(App.Item, {id: '6', name: 'spaghetti'}); 

App.ItemsController = Ember.ArrayController.create({ 
    content: App.store.findAll(App.Item), 
    sortProperties: ['name'] 
}); 

Con la última versión de Ember y Ember-datos, esto da la salida:

[ id: 4, name: banana ] 

[ id: 2, name: apple ] 

[ id: 6, name: spaghetti ] 

La cuestión aquí es que App.store.findAll() devuelve RecordArray cuya propiedad de contenido no es simplemente una matriz de App.Item instancias (en este caso, el contenido es [2, 3, 4])

Para tener realmente las manos en las instancias necesito usar algo como objectAt(). Pero incluso si extraigo las instancias App.Item del RecordArray y las vuelvo a colocar en una matriz ordinaria, las cosas no funcionan como se esperaba.

¿Me falta la forma obvia de hacerlo, o es solo el estado actual del marco? Prefiero no tener que replicar todos mis modelos como objetos simples solo para ordenarlos.

EDIT:

que tiene en torno al tema al hacer mi propia costumbre ArrayController. Aún así, sería bueno si las cosas funcionaran como arriba.

editar # 2:

original Manillar plantilla: (. Además, había utilizado un sortProperty propiedad en lugar de sortProperties en mi código anterior, pero eso fue sólo un error tipográfico)

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.content }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

Y sí, si se utiliza en lugar

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.arrangedContent }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

A continuación, obtener exactamente lo que queremos:

[ id: 2, name: apple ] 

[ id: 4, name: banana ] 

[ id: 6, name: spaghetti ] 
+5

lo siento, no lo ha hecho un particular buen trabajo de explicar lo que no funciona aquí, ¿puede poner su plantilla de manubrios? Creo que hay un pequeño problema donde a veces hay que vincularse al valor 'arrangedContent' del' ArrayController' para obtener los objetos correctamente ordenados. –

Respuesta

6

A partir de Ember 1.1.2 y ember-data 1.0.0-beta.3, y probablemente antes, basta con establecer sortProperties en el controlador. sortAscending se puede establecer en true o false según la dirección que desee ordenar.

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['name'], 
    sortAscending: true 
}) 

Sin embargo, tenga en cuenta que

sortProperties: ['id'] 

parece tipo léxico en lugar de numéricamente. Pasé por la clasificación léxica por una marca de tiempo created_at, pero puede haber otra forma de evitarlo.

+0

¿puede 'sortProperties' cambiarse dinámicamente después de la carga? y ¿cómo eliges ascendente o descendente? –

+0

Agregado en referencia a sortAscending. Además, en cuanto a cambiar la clasificación dinámicamente, parece que es posible - http://stackoverflow.com/questions/12476682/how-to-modify-the-sortproperties-value-dynamically-inside-an-ember- js-arraycontr –

11

que tenían el mismo problema. Me tomó un tiempo, pero finalmente esta solución general resolvió:

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['id'], 
    sortAscending: true, 

    sortedContent: (function() { 
    var content; 
    content = this.get("content") || []; 
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, { 
     content: content.toArray(), 
     sortProperties: this.get('sortProperties'), 
     sortAscending: this.get('sortAscending') 
    }); 
    }).property("[email protected]", 'sortProperties', 'sortAscending'), 

    doSort: function(sortBy) { 
    var previousSortBy; 
    previousSortBy = this.get('sortProperties.0'); 
    if (sortBy === previousSortBy) { 
     return this.set('sortAscending', !this.get('sortAscending')); 
    } else { 
     set('sortAscending', true); 
     return this.set('sortProperties', [sortBy]); 
    } 
    } 
}); 

Ahora, la mayoría de mis ArrayControllers extienden App.ArrayController en lugar de Ember.ArrayController, en particular los que tienen Ember/s de datos RecordArray como contenido.

Ahora, en sus plantillas manillar, hacer esto:

{{#each item in sortedContent}} 
    ...   
{{/each}} 

en lugar de

{{#each item in content}} 
    ...   
{{/each}} 
+0

Lo acepto porque resuelve mi problema, pero como lo indicó Bradley Priest, basta con enlazar a arrangeContent. – ahmacleod

+0

Solo una nota, encontré que el uso de un ArrayController en lugar de un ArrayProxy w/mixin funcionó para mí. No estoy seguro de qué otros efectos secundarios tiene, pero funciona sin problemas. He leído que ArrayController es en realidad ArrayProxy con mixins, pero parece que no se comporta de esa manera. – mbseid

3

A partir de la versión 1.0.0-Ember rc.4 Ember.ArrayProxy.create(Ember.SortableMixin .... no parece funcionar.Use Ember.ArrayProxy.createWithMixins(Ember.SortableMixin .... o use las funciones integradas de clasificación en Ember.ArrayController.

+0

Gracias, corrigió la respuesta con su corrección :) –

4

Tuve un problema similar y lo resolví a través del docs for the array class
en mi ruta utilicé el método sortBy(). por lo que en su caso podría ser algo así como

App.store.findAll().sortBy('name'); 

Sé que esto es una cuestión de edad, sino responder a ella en caso de que alguien, como yo, se topa con

por
+1

'this.store.findAll ('todo-lista'). sortBy ('nombre')' devuelve una matriz vacía en mi extremo, no estoy seguro de por qué. – Link14

+0

¿eliminar el 'sortBy()' hace la diferencia? ¿Qué propiedad estás tratando de ordenar? – Craicerjack

+1

Este es mi código 'var todoLists = this.store.findAll ('todo-lista'). SortBy ('nombre');'. Si elimino el 'sortBy()', los resultados son correctos. El Modelo que estoy obteniendo es https://github.com/LouWii/ember-todo-list-app/blob/master/app/models/todo-list.js (todo el proyecto está en ese repositorio de Github en realidad). – Link14