2012-06-05 65 views
10

是否可以在ember.js中使用下劃線的groupBy函數?使用underscore.js groupBy與Ember.js

我有以下嘗試這顯然是不工作:

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

我收到以下錯誤:

Object App.Activity has no method 'get'

該店裝有正確數據,因此findMany不會使遠程呼叫。

問題是,findMany返回一個DS.ManyArray,它可能與_.groupBy正在查找的內容有很大不同。

+0

下劃線可以處理'活動'數組中的任何對象。如果這些對象沒有'get()'方法,則下劃線與它無關。 – Tomalak

+0

我認爲問題在於這些是ember-data DS-ManyArray對象,與_.groupBy正在尋找的內容有很大不同。 – dagda1

+0

'_.groupBy()'根本就沒有任何關係。如果您可以執行'activities [0] .get('dateLabel')',那麼也可以在'groupBy()'回調中執行'activity.get('dateLabel')'。 – Tomalak

回答

8

您可以實現對燼數據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; 
}; 
0

試試這個代碼:

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

我沒有運行此代碼來測試它是如何工作的,但這個想法是將外部範圍'綁定'到內部的閉包函數範圍中。 希望這有助於讓你有一些想法...