是否可以将下划线的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正在寻找的东西有很多不同。
答案 0 :(得分:8)
您可以为ember-data DS-ManyArray对象实现自己的groupBy
函数,并使用它扩展_
:
_.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');
上面的函数基于下划线的原始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;
};
答案 1 :(得分:0)
试试这段代码:
var activities = App.store.findMany(App.Activity, feed.mapProperty('id').uniq())
var grouped = _.groupBy(activities, function(activity){
return activity.get('dateLabel;')
}).bind(this);
我没有运行此代码来测试它是如何工作的,但我们的想法是将外部范围“绑定”到内部闭包函数范围内。 希望这有助于为您提供一些想法...