10 Stimmen

Verwendung von underscore.js groupBy mit Ember.js

Ist es möglich, die groupBy-Funktion von underscore mit ember.js zu verwenden?

Ich habe den folgenden Versuch unternommen, der offensichtlich nicht funktioniert:

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

Ich erhalte den folgenden Fehler:

Das Objekt App.Activity hat keine Methode 'get'.

Der Speicher wird mit den korrekten Daten geladen, so dass findMany keinen Remote-Aufruf tätigt.

Das Problem ist, dass findMany ein DS.ManyArray zurückgibt, das sich wahrscheinlich stark von dem unterscheidet, wonach _.groupBy sucht.

8voto

Tomalak Punkte 320467

Sie könnten Ihr eigenes groupBy Funktion speziell für ember-data DS-ManyArray-Objekte und erweitern _ mit ihm:

_.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;
};

Jetzt können Sie anrufen

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

oder einfacher ausgedrückt

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

Die obige Funktion basiert auf dem Original von underscore groupBy() Implementierung, die sehr ähnlich aussieht:

_.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;
};

0voto

Developer Punkte 927

Probieren Sie diesen Code aus:

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

Ich habe diesen Code nicht ausgeführt, um zu testen, wie er funktioniert, aber die Idee ist, den äußeren Bereich in den inneren Bereich der Schließfunktion zu "binden". Ich hoffe, dies hilft Ihnen, einige Ideen zu bekommen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X