2016-07-14 11 views
-1

ich diese JSON-Daten haben, die für eine Autocomplete-Abfrage mit EUs match_phrase_prefix Abfrage eine Rückkehr von Elasticsearch Suchergebnissen:AngularJS forEach Iteration

"hits": { 
    "total": 3, 
    "max_score": 3.3071127, 
    "hits": [ 
     { 
     "_source": { 
      "ymme": "bourne supremacy" 
     } 
     }, 
     { 
     "_source": { 
      "ymme": "bourne ultimatum" 
     } 
     }, 
     { 
     "_source": { 
      "ymme": "bourne idendity" 
     } 
     } 

Also, was ich versuche durch, dies zu tun ist, durchlaufen zu bekommen der Wert von "ymme".

Meine aktuelle Funktion in meinem Controller für die Autocomplete-Vorschläge ist wie folgt:

//suggestions 
$scope.getSuggestions = function(query) { 
$scope.isSearching = true; 
return searchService.getSuggestions(query).then(function(es_return){ 
    var phrases = es_return.hits.hits; 
    console.log(phrases); 
    if (phrases) { 
     return $scope.autocomplete.suggestions = phrases; 
     console.log(suggestions) 
    } 
    else { 
     $scope.autocomplete.suggestions = []; 
     $scope.noResults = true; 
    } 
    $scope.isSearching = false; 
    }, 
    function(error) { 
     console.log('ERROR: ', error.message); 
     $scope.isSearching = false; 
    }); 
    }; 

Was hier passiert, ist, dass die Vorschläge in der Dropdown-Liste angezeigt, aber der Wert von „ymme“ (der eigentliche Vorschlag) ist nicht an $ scope.autocomplete.suggestions übergeben.

Ich muss die Ergebnisse durchlaufen und den Wert von "ymme" auf $ scope.autocomplete.sugggestrings schieben, ich habe mir angular.forEach angesehen, aber ich bin mir nicht sicher, wie ich es umsetzen soll, da ich damit zu tun habe ein Schlüssel, Wert-Paar, das in einem Objekt, das in einem Objekt, das ein Array ist, die noch in einem anderen Objekt sind:

"hits": { 
    "hits": [ 
     { 
     "_source": { 
      "ymme": "bourne supremacy" 
      } 
     } 
     ] 
    } 

Irgendwelche Ideen, Anregungen?

UPDATE

//suggestions 
$scope.getSuggestions = function(query) { 
    $scope.isSearching = true; 
    return searchService.getSuggestions(query).then(function(es_return) { 
     var phrases = es_return.hits.hits; 
     if (phrases) { 
      return $scope.autocomplete.suggestions = phrases.map(function(item) { 
       return item._source.ymme; 
      }) 
     } else { 
      $scope.autocomplete.suggestions = []; 
      $scope.noResults = true; 
     } 
     $scope.isSearching = false; 
    }, function(error) { 
     console.log('ERROR: ', error.message); 
     $scope.isSearching = false; 
    }); 
}; 

HTML dropwdown

<input type="text" ng-model="searchTerms" class="form-control input-md" placeholder="{{ searchTerms }}" name="q" id="srch-term" uib-typeahead="query as query._source.ymme for query in getSuggestions($viewValue)" typeahead-on-select="search($item)"> 

Antwort

1

Sie map wie diese verwenden:

return $scope.autocomplete.suggestions = phrases.map(function(item) { 
    return item._source.ymme; 
}); 

HTML:

<input type="text" 
    ng-model="searchTerms" class="form-control input-md" 
    placeholder="{{ searchTerms }}" name="q" 
    id="srch-term" 
    <!-- change this --> 
    uib-typeahead="query for query in getSuggestions($viewValue)" 
    typeahead-on-select="search($item)"> 

Ich hoffe, dass dies Ihnen helfen wird.

+0

Dank für die schnelle Antwort, ich dies als forEach besser gefallen, aber wie würde ich $ scope.getSuggestions oben implementieren in? Muss ich die if else Statements loswerden oder ....? – user3125823

+1

Ersetzen Sie einfach 'return $ scope.autocomplete.suggestions = phrases;' durch den Code in der Antwort und entfernen Sie 'console.log (Vorschläge)' es ist unerreicht. Bitte schön. –

+0

genial! Ich muss das etwas später umsetzen, ich werde es akzeptieren, sobald es funktioniert! Vielen Dank – user3125823

0

, wenn Sie mit Winkel forEach hinwollen ->

var res = []; 
angular.forEach(hits.hits, function(src) { 
    res.push(src._source.ymme);  
}); 
Verwandte Themen