2012-06-05 14 views
10

Có thể sử dụng chức năng groupBy của underscore với ember.js không?Sử dụng nhóm underscore.jsBằng với Ember.js

Tôi có nỗ lực sau đó rõ ràng là không làm việc:

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

tôi nhận được lỗi sau:

Object App.Activity has no method 'get'

Các cửa hàng được nạp với các dữ liệu chính xác để findMany sẽ không làm cho một từ xa gọi điện.

Vấn đề là findMany trả về DS.ManyArray có thể khác nhiều so với những gì _.groupBy đang tìm kiếm.

+0

Dấu gạch dưới hoạt động với bất kỳ đối tượng nào nằm trong mảng 'hoạt động'. Nếu các đối tượng này không có phương thức 'get()' thì dấu gạch dưới không liên quan gì đến nó. – Tomalak

+0

Tôi nghĩ rằng vấn đề là đây là những đối tượng DS-ManyArray dữ liệu ember và khác nhiều so với những gì _.groupBy đang tìm kiếm. – dagda1

+0

'_.groupBy()' không có gì để làm với nó cả. Nếu bạn có thể thực hiện 'các hoạt động [0] .get ('dateLabel')', thì cũng có thể thực hiện 'activity.get ('dateLabel')' trong 'callBy()' callback. – Tomalak

Trả lời

8

Bạn có thể thực hiện groupBy chức năng riêng của bạn phù hợp cho ember dữ liệu DS-ManyArray đối tượng và mở rộng _ với nó:

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

Bây giờ bạn có thể gọi

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

hoặc đơn giản hơn

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

Chức năng ở trên được dựa trên gốc groupBy() thực hiện dấu gạch dưới, mà trông rất giống:

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

Hãy thử mã này:

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

Tôi không chạy mã này để kiểm tra như thế nào nó hoạt động nhưng ý tưởng là để 'ràng buộc' phạm vi bên ngoài vào phạm vi chức năng đóng cửa bên trong. Hy vọng điều này sẽ giúp bạn có được một số ý tưởng ...