2012-09-22 13 views
8

के माध्यम से एम्बर-डेटा द्वारा समर्थित एरे कंट्रोलर को सॉर्ट करना मैं ArrayController को सॉर्ट करने में सक्षम होना चाहता हूं, जिनकी सामग्री एम्बर-डेटा क्वेरी से उत्पन्न होती है। दुर्भाग्यवश, sortProperty मिक्सिन इस मामले में काम नहीं कर रहा है।सॉर्टप्रोपर्टी मिश्रित

मैं निम्न करने के लिए सक्षम होने के लिए करना चाहते हैं:

[ id: 4, name: banana ] 

[ id: 2, name: apple ] 

[ id: 6, name: spaghetti ] 

यहां मुद्दा यह है:

App = Ember.Application.create(); 
App.store = DS.Store.create({ revision: 4}); 

App.Item = DS.Model.extend({ 
    id: DS.attr('string'), 
    name: DS.attr('string') 
}); 

App.store.createRecord(App.Item, {id: '4', name: 'banana' }); 
App.store.createRecord(App.Item, {id: '2', name: 'apple'}); 
App.store.createRecord(App.Item, {id: '6', name: 'spaghetti'}); 

App.ItemsController = Ember.ArrayController.create({ 
    content: App.store.findAll(App.Item), 
    sortProperties: ['name'] 
}); 
Ember और एंबर-डेटा के नवीनतम संस्करण के साथ

, इस उत्पादन देता है कि App.store.findAll() एक RecordArray देता है जिसकी सामग्री संपत्ति App.Item उदाहरणों की एक सरणी नहीं है (इस मामले में, सामग्री [2, 3, 4])

उदाहरणों पर वास्तव में मेरे हाथों को पाने के लिए मुझे objectAt() जैसे कुछ उपयोग करने की आवश्यकता है। लेकिन अगर मैं से App.Item उदाहरण निकालता हूं और उन्हें सामान्य सरणी में डंप करता हूं, तो चीजें अपेक्षा के अनुसार काम नहीं करती हैं।

क्या मुझे ऐसा करने का स्पष्ट तरीका याद आ रहा है, या क्या यह ढांचे की वर्तमान स्थिति है? मुझे बस अपने सभी मॉडलों को बस क्रमबद्ध करने के लिए सादा वस्तुओं के रूप में दोहराना नहीं होगा।

संपादित करें:

मैं अपने स्वयं के कस्टम ArrayController बनाकर समस्या के समाधान मिल गया। फिर भी, अगर चीजें ऊपर की तरह काम करती हैं तो यह अच्छा होगा।

संपादित करें # 2:

मूल Handlebars टेम्पलेट: (। इसके अलावा, मैं ऊपर मेरी कोड में sortProperties के बजाय एक sortProperty संपत्ति का इस्तेमाल किया था, लेकिन वह सिर्फ एक टाइपो था)

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.content }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

और हाँ, एक के बजाय का उपयोग करता है, तो

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.arrangedContent }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

फिर हम मिल हम क्या चाहते हैं:

[ id: 2, name: apple ] 

[ id: 4, name: banana ] 

[ id: 6, name: spaghetti ] 
+5

द्वारा पर ठोकर मुझे माफ करना, आप नहीं एक विशेष रूप से किया है यहां क्या काम नहीं कर रहा है, यह समझाने का अच्छा काम है, क्या आप कृपया अपने हैंडलबर्स टेम्पलेट को अंदर रख सकते हैं। मुझे लगता है कि एक छोटी सी समस्या है जहां कभी-कभी आपको सही ऑर्डर करने के लिए 'ArrayController' के' व्यवस्थित सामग्री 'मान से जोड़ना पड़ता है। –

उत्तर

6

एम्बर 1.1.2 और एम्बर-डेटा 1.0.0-बीटा 3 के रूप में, और शायद पहले, बस नियंत्रक पर सॉर्टप्रॉपर्टी सेट करना पर्याप्त है। sortAscending को true या false पर सेट किया जा सकता है जिस पर आप निर्देश करना चाहते हैं।

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['name'], 
    sortAscending: true 
}) 

हालांकि, ध्यान दें कि

sortProperties: ['id'] 

के प्रकार lexically बजाय संख्यानुसार प्रकट होता है। मैं एक create_at टाइमस्टैम्प द्वारा लेक्सिकल सॉर्टिंग के आसपास मिला, लेकिन इसके चारों ओर एक और तरीका हो सकता है।

+0

लोड के बाद 'sortProperties' गतिशील रूप से बदला जा सकता है? और आप आरोही या अवरोही कैसे चुनते हैं? –

+0

sortAscending के संदर्भ में जोड़ा गया। साथ ही, क्रमशः सॉर्टिंग को गतिशील रूप से बदलते हुए, ऐसा लगता है कि यह संभव है - http://stackoverflow.com/questions/12476682/how-to-modify-the-sortproperties-value- गतिशील-inside-an-ember- js-arraycontr –

11

मैं एक ही समस्या थी। मुझे कुछ समय लिया, लेकिन अंत में यह सामान्य समाधान इसे हल:

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['id'], 
    sortAscending: true, 

    sortedContent: (function() { 
    var content; 
    content = this.get("content") || []; 
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, { 
     content: content.toArray(), 
     sortProperties: this.get('sortProperties'), 
     sortAscending: this.get('sortAscending') 
    }); 
    }).property("[email protected]", 'sortProperties', 'sortAscending'), 

    doSort: function(sortBy) { 
    var previousSortBy; 
    previousSortBy = this.get('sortProperties.0'); 
    if (sortBy === previousSortBy) { 
     return this.set('sortAscending', !this.get('sortAscending')); 
    } else { 
     set('sortAscending', true); 
     return this.set('sortProperties', [sortBy]); 
    } 
    } 
}); 

अब मेरी ArrayControllers के सबसे खास लोगों को सामग्री के रूप में है कि एंबर/डेटा RecordArray रों में, App.ArrayController बजाय Ember.ArrayController का विस्तार।

अब, अपने हैंडल टेम्पलेट्स में, ऐसा करते हैं:

{{#each item in sortedContent}} 
    ...   
{{/each}} 

बजाय

{{#each item in content}} 
    ...   
{{/each}} 
+0

मैं इसे स्वीकार कर रहा हूं क्योंकि यह मेरी समस्या का समाधान करता है, लेकिन ब्रैडली पुजारी ऊपर बताए गए अनुसार, व्यवस्थित करने के लिए बाध्यकारी सामग्री पर्याप्त है। – ahmacleod

+0

बस एक नोट, मैंने पाया कि एक ऐरेप्रोक्सी डब्ल्यू/मिक्सिन के बजाय एक ऐरे कंट्रोलर का उपयोग करने के लिए मेरे लिए काम किया। मुझे यकीन नहीं है कि इसका क्या दुष्प्रभाव है, लेकिन यह बेकार ढंग से काम करता है। मैंने पढ़ा है कि ऐरे कंट्रोलर वास्तव में मिश्रणों के साथ ऐरेप्रोक्सी है, लेकिन ऐसा लगता है कि ऐसा व्यवहार नहीं करता है। – mbseid

3

की एंबर संस्करण 1.0.0-rc.4 Ember.ArrayProxy.create(Ember.SortableMixin .... के रूप में अब और काम करने के लिए प्रतीत नहीं होता। Ember.ArrayProxy.createWithMixins(Ember.SortableMixin .... का उपयोग करें या एम्बर.एरेरे कंट्रोलर में अंतर्निहित सॉर्टिंग कार्यक्षमताओं का उपयोग करें।

+0

धन्यवाद, आपके फिक्स के साथ उत्तर संपादित किया गया :) –

4

मैं ने वही समस्या थी और docs for the array class
मेरे मार्ग में मैं sortBy() विधि का इस्तेमाल के माध्यम से इसे हल। इसलिए आपके मामले में ऐसा

App.store.findAll().sortBy('name'); 

कुछ हो सकता है मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मामले में किसी को यह जवाब दे, जैसे अपने आप

+1

'this.store.findAll ('todo-list')। sortBy ('name') 'मेरे अंत में एक खाली सरणी लौटा रहा है, यकीन नहीं क्यों। – Link14

+0

'sortBy()' को एक अंतर बना रहा है? आप किस संपत्ति को सॉर्ट करने की कोशिश कर रहे हैं? – Craicerjack

+1

यह मेरा कोड 'var todoLists = this.store.findAll (' todo-list ') है। Sortby (' name '); '। अगर मैं 'sortBy() 'को हटा देता हूं, तो परिणाम सही होते हैं। मैं जो मॉडल प्राप्त कर रहा हूं वह है https://github.com/LouWii/ember-todo-list-app/blob/master/app/models/todo-list.js (पूरी परियोजना वास्तव में उस गिथब रेपो पर है)। – Link14

संबंधित मुद्दे