2015-01-15 12 views
5

मेरे पास ngTable के साथ तालिका पर प्रदर्शित करने के लिए ऑब्जेक्ट्स की एक सूची है। मेरे वस्तु लगता है:ngtable: नेस्टेड ऑब्जेक्ट पर सॉर्ट और फ़िल्टर

obj {label:string, 
    nestObj{nestLabel:string 
      } 
    } 

मेरी नियंत्रक में मैं छंटाई और खेतों 'लेबल' और 'nestObject.label' पर छानने अनुमति देना चाहते हैं। मैं इस की कोशिश की है:

Uncaugth syntexError: अप्रत्याशित टोकन

$scope.tableParams = new ngTableParams({ 
     page: 1,   // show first page 
     count: 10, 
     filter: { 
      label='', 
      nestObj.label='' 
     }, 
     sorting: { 
      label: 'asc', 
      nestObj.label: 'asc' 
     } 
    }, { 
     total: data.length, // length of data 
     getData: function($defer, params) { 
      // use build-in angular filter 
      var filteredData = params.filter() ? 
      $filter('filter')(data, params.filter()) : 
      data; 
      var orderedData = params.sorting() ? 
        $filter('orderBy')(filteredData, params.orderBy()) : 
        data; 

      params.total(orderedData.length); // set total for recalc pagination 
      $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())); 
    }   
}); 

लेकिन मैं एक त्रुटि हो रही हूँ, जावास्क्रिप्ट संकलक nestObj.label पर फिल्टर पसंद नहीं है।

आईटी अच्छी तरह से काम करता है अगर मैं फिल्टर करने और nestObj.label पर छांटे नहीं।

क्या नेस्टेड ऑब्जेक्ट को ngTable के साथ फ़िल्टर करना और सॉर्ट करना संभव है?

यहां plunker है जो समस्या का वर्णन करता है।

धन्यवाद।

+0

क्या आप हमें प्लंकर या jsfiddle प्रदान कर सकते हैं ..? – squiroid

+0

मैंने मुख्य संदेश – user1260928

उत्तर

8

दुर्भाग्यवश, नेस्टेड ऑब्जेक्ट्स के साथ फ़िल्टरिंग और सॉर्टिंग अब के लिए एनजी-टेबल में उपयुक्त नहीं है। यह post और @Kostia Mololkin से समाधान पढ़ने के बाद, मुझे अंत में यह पता चला कि इस बग से कैसे बचें और समाधान अंत में बहुत आसान है। उसके लिए बड़ा धन्यवाद!

मैं सिर्फ सरणी जहां अपने डेटा है दुबारा लिखा: नई संपत्ति प्रारंभ और जैसे नए संपत्ति में नेस्टेड वस्तु से डेटा सेट:

for (var i = 0; i < data.length; i++) { 
    data[i].town = ""; //initialization of new property 
    data[i].town = data[i].adresse.town; //set the data from nested obj into new property 
} 

आप plunker पर यहाँ इस समाधान देख सकते हैं, अब यह है एक आकर्षण की तरह काम कर रहा है ...

+0

में प्लंकर जोड़ा, मैंने अपना पिछला उत्तर हटा दिया क्योंकि मैं इसे हल करने का पूरी तरह गलत तरीका था। उम्मीद है कि यह है! :) – arman1991

+0

धन्यवाद अरमान, यह अब ठीक काम करता है;) – user1260928

+0

यदि आप इस समाधान से संतुष्ट हैं, तो आप मेरा जवाब भी स्वीकार कर सकते हैं :) मुझे खुशी है कि मैंने मदद की। – arman1991

0

बस मेरे दो सेंट जोड़कर, मैं कार्यात्मक प्रोग्रामिंग का उपयोग करने से डरो मत। सपाट डेटा सरल है और मेरी राय में क्लीनर तो जैसे:

var flattenedArray = dataArray.map(function(obj) { 
    return { 
     label: obj.label, 
     nestedLabel: dataItem.nestedObj.nestedLabel 
    }; 
}); 

तो आप आसानी से ngTable में label और nestedLabel द्वारा सॉर्ट कर सकते हैं।

नोट: मुझे एहसास है कि हम यहां प्रतियां बना रहे हैं ताकि थोड़ी अधिक मेमोरी खाई जा सके।

0

नेस्टेड पैरा और ऑर्डरिंग और पेजिंग के लिए अतिरिक्त समर्थन का समर्थन करने के लिए getData विधि है। $filter इंजेक्ट करने की आवश्यकता है और डेटा की अपनी सरणी के साथ myData का नाम बदलें। उम्मीद है कि यह मदद कर सकता है।

$scope.tableParams = new NgTableParams({}, 
{ 
    getData: function($defer, params) { 

     // organize filter as $filter understand it (graph object) 
     var filters = {}; 
     angular.forEach(params.filter(), function(val,key){ 
      var filter = filters; 
      var parts = key.split('.'); 
      for (var i=0;i<parts.length;i++){ 
       if (i!=parts.length-1) { 
        filter[parts[i]] = {}; 
        filter = filter[parts[i]]; 
       } 
       else { 
        filter[parts[i]] = val; 
       } 
      } 
     }) 

     // filter with $filter (don't forget to inject it) 
     var filteredDatas = 
      params.filter() ? 
       $filter('filter')(myDatas, filters) : 
       myDatas; 

     // ordering 
     var sorting = params.sorting(); 
     var key = sorting ? Object.keys(sorting)[0] : null; 
     var orderedDatas = sorting ? $filter('orderBy')(filteredDatas, key, sorting[key] == 'desc') : filteredDatas; 

     // get for the wanted subset 
     var splitedDatas = 
      orderedDatas.slice((params.page() - 1) * params.count(), 
       params.page() * params.count()); 

     params.total(splitedDatas.length); 

     // resolve the ngTable promise 
     $defer.resolve(splitedDatas); 
    } 
}); 
संबंधित मुद्दे