11

नियंत्रकफिल्टर: notarray उम्मीद सरणी लेकिन प्राप्त: 0

@RequestMapping(value = "/graphs", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public Collection<Graph> getSkeletonGraph() 
    { 
     log.debug("REST request to get current graphs"); 
     return graphService.getSkeletonGraphs(); 
    } 

कोणीय कॉल

$scope.graphs = []; 
    Graph.getGraphs().$promise.then(function(result) 
    { 
     $scope.graphs = result; 
    }); 



    angular.module('sampleApplicationApp').factory('Graph', function($resource) 
    { 
     return { 
     getGraphs: function() { 
      return $resource('api/graphs/:id').query(); 
     } 
    }; 
    }) 

मुझे यकीन है कि क्यों फिल्टर का उपयोग कर नहीं कर रहा हूँ मैं अपवाद मिलता है।

कोणीय दस्तावेज़ https://docs.angularjs.org/error/filter/notarray में भी देखा गया मेरा परिणाम सरणी है लेकिन यह सुनिश्चित नहीं है कि मुझे ऐसा अपवाद क्यों मिल रहा है।

बैकएंड से नमूना परिणाम मुझे मिल रहा है।

[{"id":"135520b0-9e4b-11e5-a67e-5668957d0149","area":"Bingo","models":[],"enumerateds":[]},{"id":"0db925e0-9e53-11e5-a67e-5668957d0149","area":"jin","models":[],"enumerateds":[]},{"id":"7a717330-9788-11e5-b259-5668957d0149","area":"Product","models":[],"enumerateds":[]},{"id":"402d4c30-980f-11e5-a2a3-5668957d0149","area":"fgfgfg","models":[],"enumerateds":[]},{"id":"404b77b0-9e53-11e5-a67e-5668957d0149","area":"olah","models":[],"enumerateds":[]},{"id":"cd071b10-9e52-11e5-a67e-5668957d0149","area":"lolo","models":[],"enumerateds":[]},{"id":"d9808e60-9710-11e5-b112-5668957d0149","area":"catalog","models":[],"enumerateds":[]},{"id":"2aaca9f0-97e2-11e5-91cd-5668957d0149","area":"btg","models":[],"enumerateds":[]},{"id":"955e9ed0-978c-11e5-93fd-5668957d0149","area":"promotions","models":[],"enumerateds":[]},{"id":"1e441d60-980f-11e5-a2a3-5668957d0149","area":"hjuhh","models":[],"enumerateds":[]},{"id":"fb96dfe0-978d-11e5-93fd-5668957d0149","area":"voucher","models":[],"enumerateds":[]}] 

एचटीएमएल

<li ng-repeat="g in graphs track by $index | filter:searchText"></li> 

उत्तर

53

समस्या उत्पन्न हो रही है क्योंकि आप track by $index उपयोग कर रहे हैं इससे पहले कि आप अपने फिल्टर आवेदन कर रहे हैं। हमेशा पिछले पर होना चाहिए, अपने सभी फिल्टर के बाद

<li ng-repeat="g in graphs | filter:searchText track by $index"></li> 

track by अभिव्यक्ति: इस को हल करने के लिए आपकी अभिव्यक्ति बदल जाते हैं। इसका एक नियम डॉक्स में उल्लेख किया है: ngRepeat

स्पष्टीकरण:

जब आप track by $indexngRepeat में उपयोग नहीं करते हैं, सभी का इस्तेमाल किया फिल्टर के लिए इनपुट सरणी, कि है, अगर इसकी

ng-repeat="item in items | filter1 | filter2", 

तो items डिफ़ॉल्ट रूप से फ़िल्टर को पास किया गया इनपुट है और इस इनपुट पर फ़िल्टरिंग किया जाता है।

हालांकि, जब तुम track by $index उपयोग करते हैं, फिल्टर करने के लिए इनपुट $index बजाय items और इसलिए त्रुटि हो जाता है:

Expected array(read: items) but received 0(read: $index).

इसलिए, इस का मुकाबला करने, सरणी पहले सभी फिल्टर और के माध्यम से पारित हो जाता है फ़िल्टर किए गए परिणाम का उपयोग track by $index के साथ किया जाता है।

आशा है कि यह इसे साफ़ कर देगा।

+0

के प्रलेखन के अनुसार आप अपने सुझाव –

+3

इसका एक नियम डॉक्स में उल्लेख के पीछे तर्क बताएं सकता है। अभिव्यक्ति द्वारा ट्रैक से पहले फ़िल्टर लागू किया जाना चाहिए। दस्तावेज़ों में देखें: https: //docs.angularjs।संगठन/एपीआई/एनजी/निर्देश/एनजी दोहराएं –

+0

यह पता लगाने की कोशिश करने के 2 घंटों खर्च करने के बाद कि कोणीय वेबसाइट पर फ़िल्टर क्यों काम कर रहा था और मेरा यह एकमात्र उत्तर नहीं था जिसने मेरी समस्या हल की! कहने की जरूरत नहीं है कि मुझे शायद दस्तावेज़ों को फिर से खोलने और पढ़ने की आवश्यकता होगी। हालांकि यह बहुत ही सहज ज्ञान युक्त है और त्रुटि बिल्कुल मदद नहीं करती है, क्यों 'सूचकांक द्वारा ट्रैक किया गया' हमेशा अंतिम अभिव्यक्ति होना चाहिए? मेरे सिर में कोई समझ नहीं आता है। – MacK

2

तुम हमेशा अभिव्यक्ति

<li ng-repeat="g in graphs | filter:searchText track by $index"></li> 

के अंत में track by का उपयोग करना चाहिए, जबकि काम करने के लिए द्वारा ट्रैक के लिए ng-repeat कोणीय जरूरतों अंतिम परिणाम के लिए एक अभिव्यक्ति का मूल्यांकन के बाद से। यदि आप इसे अंत में प्रदान करते हैं, तो आपका फ़िल्टर लागू किया जाएगा और track by अंतिम आउटपुट पर गणना की जाएगी। आप कोणीय दस्तावेज़ों पर स्रोत कोड देख सकते हैं।

ng-repeat

If you are working with objects that have an identifier property, you should track by the identifier instead of the whole object. Should you reload your data later, ngRepeat will not have to rebuild the DOM elements for items it has already rendered, even if the JavaScript objects in the collection have been substituted for new ones. For large collections, this signifincantly improves rendering performance. If you don't have a unique identifier, track by $index can also provide a performance boost.

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