2012-06-05 13 views
10

È possibile utilizzare la funzione groupBy del underscore con ember.js?Utilizzo di underscore.js groupBy con Ember.js

ho il seguente tentativo che ovviamente non funziona:

var activities = App.store.findMany(App.Activity, feed.mapProperty('id').uniq()) 
var grouped = _.groupBy(activities, function(activity){ 
    return activity.get('dateLabel;') 
}); 

ottengo il seguente errore:

Object App.Activity has no method 'get'

Il link è caricato con i dati corretti in modo findMany non farà un telecomando chiamata.

Il problema è che findMany restituisce un oggetto DS.ManyArray che è probabilmente molto diverso da quello che _.groupBy sta cercando.

+0

Underscore funziona con qualunque oggetto si trovi nella matrice 'activities'. Se questi oggetti non hanno il metodo 'get()', il carattere di sottolineatura non ha nulla a che fare con esso. – Tomalak

+0

Penso che il problema sia che si tratta di oggetti DS-ManyArray di ember-data e sono molto diversi da ciò che _.groupBy sta cercando. – dagda1

+0

'_.groupBy()' non ha niente a che fare con questo. Se puoi fare 'activities [0] .get ('dateLabel')', allora sarà anche in grado di fare 'activity.get ('dateLabel')' nel callback 'groupBy()'. – Tomalak

risposta

8

Si potrebbe implementare una propria funzione groupBy su misura per tempora-dati DS-ManyArray oggetti ed estendere _ con esso:

_.emberArrayGroupBy = function(emberArray, val) { 
    var result = {}, key, value, i, l = emberArray.get('length'), 
     iterator = _.isFunction(val) ? val : function(obj) { return obj.get(val); }; 

    for (i = 0; i < l; i++) { 
    value = emberArray.objectAt(i); 
    key = iterator(value, i); 
    (result[key] || (result[key] = [])).push(value); 
    } 
    return result; 
}; 

Ora è possibile chiamare

var grouped = _.emberArrayGroupBy(activities, function(activity) { 
    return activity.get('dateLabel'); 
}); 

o più semplicemente

var grouped = _.emberArrayGroupBy(activities, 'dateLabel'); 

La funzione di cui sopra si basa su groupBy() implementazione originale di sottolineatura, che sembra molto simile:

_.groupBy = function(obj, val) { 
    var result = {}; 
    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; 
    each(obj, function(value, index) { 
    var key = iterator(value, index); 
    (result[key] || (result[key] = [])).push(value); 
    }); 
    return result; 
}; 
0

provare questo codice:

var activities = App.store.findMany(App.Activity, feed.mapProperty('id').uniq()) 
var grouped = _.groupBy(activities, function(activity){ 
    return activity.get('dateLabel;') 
}).bind(this); 

non ho eseguito questo codice per verificare come funziona, ma l'idea è di "legare" l'ambito esterno in ambito di chiusura della funzione di chiusura. Spero che questo ti aiuti a darti qualche idea ...