10

是否可以将下划线的 groupBy 函数与 ember.js 一起使用?

我有以下尝试显然不起作用:

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

我收到以下错误:

对象 App.Activity 没有“get”方法

商店加载了正确的数据,因此 findMany 不会进行远程调用。

问题是 findMany 返回一个 DS.ManyArray 可能与 _.groupBy 正在寻找的有很大不同。

4

2 回答 2

8

groupBy您可以实现为 ember-data DS-ManyArray 对象量身定制的自己的函数并_使用它进行扩展:

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

现在你可以打电话

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

或更简单地说

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

上面的函数是基于 underscore 的原始groupBy()实现,看起来非常相似:

_.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;
};
于 2012-06-05T16:23:38.277 回答
0

试试这个代码:

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

我没有运行这段代码来测试它是如何工作的,但我的想法是将外部作用域“绑定”到内部闭包函数作用域中。希望这可以帮助您获得一些想法...

于 2016-02-03T22:26:56.637 回答