2012-06-05 23 views
10

के साथ अंडरस्कोर समूह का उपयोग करना संभव है ember.js के साथ फ़ंक्शन?underscore.js समूह का उपयोग 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 एक दूरस्थ नहीं होगा

मैं निम्नलिखित प्रयास जो स्पष्ट रूप से काम नहीं कर रहा है है कहते हैं।

समस्या यह है कि कोई भी एक DS.ManyArray देता है जो शायद _.group की तलाश में बहुत अलग है।

+0

अंडरस्कोर 'गतिविधियों' सरणी में जो भी ऑब्जेक्ट्स के साथ काम करता है। यदि इन ऑब्जेक्ट्स को 'get()' विधि नहीं है तो अंडरस्कोर के पास इसके साथ कुछ लेना देना नहीं है। – Tomalak

+0

मुझे लगता है कि समस्या यह है कि ये एम्बर-डेटा डीएस-मॉनएरे ऑब्जेक्ट्स हैं और _.group की तलाश में बहुत अलग हैं। – dagda1

+0

'_.groupBy() 'के साथ इसका कोई लेना-देना नहीं है। यदि आप 'गतिविधियां [0] .get (' dateLabel ') 'कर सकते हैं, तो' groupBy() 'कॉलबैक में' गतिविधि.get (' dateLabel ') 'करने में भी सक्षम होंगे। – Tomalak

उत्तर

8

आप अपनी खुद की groupBy समारोह एंबर-डेटा डी एस 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'); 

समारोह ऊपर अंडरस्कोर के मूल groupBy() कार्यान्वयन, जो बहुत समान दिखता है पर आधारित है:

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

मैं परीक्षण करने के लिए यह कैसे काम करता है इस कोड नहीं चला लेकिन विचार:

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

इस कोड का प्रयास करें आंतरिक क्लोजर फ़ंक्शन स्कोप में बाहरी दायरे को 'बांधना' है। आशा है कि इससे आपको कुछ विचार प्राप्त करने में मदद मिलेगी ...