2017-05-25 8 views
0

Tl; dr: Wenn eine Boolesche auf false Spiegel, die zu einem ng-if-Attribute gebunden ist, das Element mit dem ng-if-Attribut bleibt im DOM bis genau drei anderen Elementen sind ausgewählt. Warum verschwindet das Element nicht sofort, wenn der Boolean auf false umgedreht wird?unerwartete ng-ui-Bootstrap-typeahead Verhalten

ich typeahead Setup mit einem typeahead-no-Ergebnisse boolean zu einer Warnmeldung angebracht haben, die wie dieses ich denke, es

<input class="full-width" id="customerParentInput" 
     ng-model="$ctrl.customer.customerParentId" 
     uib-typeahead="option.value as option.key for option in $ctrl.customerLookupData.data | filter:$viewValue | limitTo:10" 
     typeahead-no-results="$ctrl.noResultParent"/> 
<label ng-if="$ctrl.noResultParent" class="text-danger">No results. Create new customers in the Customer page in the Settings tab.</label> 

aussieht, ist ein bekanntes Problem mit dem typeahead, dass, wenn Sie 0 Ergebnisse, und Sie leeren das Textfeld, der boolean wird nicht zurück zu false. Bei einem leeren Textfeld erscheint mein Label immer noch im DOM.

Also habe ich einen Ereignis-Listener eingerichtet, der darauf wartet, dass die Eingabe den Fokus verliert. Sobald es den Fokus verliert, sieht es aus, ob der boolesche Wert immer noch wahr ist und ob das Textfeld einen Wert enthält.

Hier ist dieser Code.

setListener =() => { 
    $('#customerParentInput').blur(() => { 
     var inputVal: string = $('#customerParentInput').val(); 
     if (this.noResultParent === true && inputVal.length === 0) { 
      this.noResultParent = false; 
     } 
    }); 
}; 

Das zwingt also den boolean mein Etikett ist an gleich falsch angehängt. In der Theorie sollte dies das Label verschwinden lassen.

Hier ist das Problem. Die Beschriftung bleibt im DOM sichtbar, bis ich genau drei andere Elemente im DOM anklicke.

So zum Beispiel,

Ich tippe in das Textfeld

Keine Ergebnisse gefunden werden, ich werde Fokus verschieben, wird die Warnung bleibt, macht Sinn.

Ich gehe zurück, entfernen Sie den gesamten Text, verlieren Sie den Fokus.

Mein Listener feuert ab, der Boolesche Wert ist auf false gesetzt, aber das Label bleibt bestehen.

Ich klicke auf drei verschiedene Eingabefelder, und dann verschwindet mein Etikett.

Weiß jemand, warum das ein notwendiger Teil ist, mein Etikett verschwinden zu lassen? Und kann ich alles tun, damit das Label sofort verschwindet, wenn der Boolesche Wert auf false gesetzt wird?

Antwort

1

Also, zur Fixierung des Etiketts angezeigt, wenn der Eingabetext ist leer, vielleicht könnte dies besser sein:

<label ng-if="$ctrl.noResultParent && $ctrl.customer.customerParentId.length > 0" class="text-danger">No results. Create new customers in the Customer page in the Settings tab.</label> 

und vielleicht auch das andere Problem kann

+0

Worte fixiert werden können nicht ausdrücken, wie dumm ich fühle , haha. Offensichtlich hätte ich die zweite Bedingung in die ng-if-Anweisung aufnehmen sollen und nicht versuchen, die erste für meine Bedürfnisse scharf zu machen. Vielen Dank, ich habe nur Ihre Empfehlung umgesetzt und es hat wie ein Zauber funktioniert! Ich muss einen verrückten Tunnelblick haben, um das nicht als Lösung zu sehen. – Chris

+1

Sie sind willkommen :) es passiert, manchmal die beste Lösung sind die einfachsten: D – quirimmo

Verwandte Themen