2016-08-16 4 views
0

Ich habe derzeit ein kleines Problem mit einer bestimmten Schleife zum Anzeigen einer Schaltfläche.AngularJS - ForEach Loop

Ich würde gerne eine 'suggetBirdname' Taste abhängig von zwei Aussagen zeigen: 1. Dass der Benutzer nicht Besitzer des Threads ist. 2. Dass der Benutzer noch keinen Vogel auf dem Thread vorgeschlagen hat.

Dies ist, was ich derzeit haben:

// Globelvariable 
$scope.showSuggestionButton = false; 

var currentSuggestions = res.data.birdsuggestions; 
    currentSuggestions.forEach(function(suggestions) { 
    if(suggestions.userId === auth.profile.user_id 
      && $scope.capture.birdname==='Unknown') { 
     $scope.showSuggestionButton = false; 
     } else { 
      $scope.showSuggestionButton = true; 
     } 
    }) 

Wie Sie im obigen Code sehen können, sie alle meine Daten des aktuellen Threads durchläuft wir auf der Suche durch die Vorschläge sind. Wie Sie sehen können, setze ich den Standardwert auf $scope.showSuggestionButton = false;, da er nicht sichtbar sein muss, wenn die obigen Anweisungen nicht übergeben werden.

Das Problem beim Durchlaufen der Schleife ist: Wenn der aktuell angemeldete Benutzer nicht der Letzte ist, der einen Vorschlag gepostet hat, bleibt die Schleife einfach weiter und setzt die Anweisung daher auf "True". Ich brauche einen Weg, um die Schleife zu verlassen, sobald die folgenden Anweisungen ausgelöst werden: suggestions.userId === auth.profile.user_id && $scope.capture.birdname==='Unknown'

Es ist wahrscheinlich und einfache Lösung, aber ich kann einfach nicht den Kopf scheint im Moment um ihn herum zu wickeln ..

Jede Hilfe wird sehr geschätzt.

Zur weiteren Klarstellung:

Im Folgenden werde ich eine Taste, ein Formular zu öffnen, um einen Vorschlag zu schreiben. Ich möchte nur, dass es sichtbar ist, wenn die oben genannten Aussagen gültig sind. Durch die Daten des Beitrags (mit den Vorschlägen verknüpft), möchte ich die Schleife oben verwenden, um die Schaltfläche anzuzeigen.

+0

Haben Sie versucht $ Scope. $ Uhr? –

+0

Können Sie Ihre Logik ausarbeiten? –

+0

Sind Sie sicher, dass Ihre erste if-Anweisung korrekt ausgeführt wird? Ich würde sicherstellen, dass Ihre erste if-Anweisung korrekt auswertet, bevor Sie etwas anderes überprüfen. – Ted

Antwort

1

Ich denke, was Sie tun müssen, ist Schleife zu stoppen, sobald Sie herausfinden, dass der Benutzer bereits einen Vogel vorgeschlagen hat.

Also, anstatt auf alle die Vorschläge zu schleifen, auch wenn Sie finden, dass Benutzer bereits einen Vogel vorgeschlagen hat, müssen Sie aus der Schleife ausbrechen.

Ich würde Ihre Logik zu tun Gegenteil tun, was Sie getan haben, d. H. Vorschlag standardmäßig anzeigen, und verstecken Sie es, wenn Sie herausfinden, dass der Benutzer einen Vogel bereits vorgeschlagen hat.

$scope.showSuggestionButton = true; 
$scope.checkedAllSuggestions = false; 
var currentSuggestions = res.data.birdsuggestions; 
for(var i=0; i<currentSuggestions.length;i++) { 
    if(currentSuggestions[i].userId === auth.profile.user_id && $scope.capture.birdname==='Unknown') { 
    //is $scope.capture.birdname==='Unknown' check needed here, cause it has nothing to do with loop variables? 
     $scope.showSuggestionButton = false; 
     break; 
    } 
} 
$scope.checkedAllSuggestions = true; 

EDIT: Sie können Ihre ng-if Zustand ändern nur um zu zeigen, wenn alle Vorschläge verarbeitet werden. Dies wird Ihre anfängliche Anzeige des Knopfgehäuses lösen. Es mag wie ein hässlicher Hack aussehen, wird diese Antwort aktualisieren, wenn ich einen besseren Weg finde, es zu tun.

<span class="suggest-birdname-button" ng-if="showSuggestionButton && checkedAllSuggestions"> 

Wenn Sie keine for-Schleife verwenden möchten, gibt es andere saubere Möglichkeiten, dies zu tun. Sie können underscore für solche Funktionen verwenden.

+0

Ich hatte diese Option bereits, obwohl, wenn die Seite geladen wird, gibt es einen kurzen Moment, wo die Schaltfläche sichtbar ist – Borni

+0

@Borni Aktualisierte Antwort mit einem * hackish * Weg, wird eine bessere Lösung und ein Update finden die Antwort. –

+1

Das funktioniert aber schon. Ich werde es bereits als eine gute Antwort markieren. Wenn Sie eine bessere Lösung finden, zögern Sie nicht, es zu veröffentlichen! Danke – Borni

0

Sie sollten Ihre Schleife brechen, wenn Ihre Bedingung wahr ist.

Aber es gibt einen einfachen Weg mit Array.prototype.some() Methode.

$scope.showSuggestionButton = currentSuggestions.some(function(suggestion){ 
    return suggestion.userId === auth.profile.user_id && $scope.capture.birdname==='Unknown'; 
}); 

$scope.showSuggestionButton Wert wird als wahr/falsch nach Ihren, wenn die Bedingung festgelegt werden.

+0

Das scheint nicht für mich zu funktionieren, könnten Sie bitte erläutern? – Borni

+0

@Borni Ich habe die Antwort bearbeitet, '$ scope.showSuggestionButton' ist wahr oder falsch (ich habe eine falsche Scope-Variable geschrieben, anstatt sie zu bearbeiten.). Sie können diesen Codeblock erneut versuchen. –

+0

Es scheint immer noch nicht zu funktionieren. – Borni