5

In einer Website, die ich mit AngularJS baue, habe ich eine Eingabe mit einem Typeahead, für den ich angular-typeahead verwende. Es funktioniert gut in Chrome, Opera und Safari, aber nicht in Firefox. Das Problem scheint zu sein, dass das Modell in Firefox nicht aktualisiert wird, wenn ich auf den Tippvorschlag tippe.Warum wird mein ng-Modell nicht mit Typeahead in Firefox aktualisiert?

sieht mein html wie folgt aus:

<input class="typeahead" sf-typeahead type="text" datasets="userDataset" ng-model="searchUser" > 
<button ng-click="sendToUser(searchUser.id)" class="btn">Send</button> 

und in meinem Controller Ich habe diese einfache Funktion:

$scope.sendToUser = function(userId){ 
    console.log(userId); 
    // More code here.. 
} 

In Chrome, Opera und Safari es einen int für die userId anmeldet, aber in Firefox loggt nur undefined.

Ich machte eine plunker for it here um zu zeigen, was ich meine (Suche nach "eins" oder "zwei").

Es funktioniert in Chrome, Opera und Safari, aber in Firefox zeigt es irgendwie undefined in der Konsole. Das Besondere ist, dass es beim ersten Mal nur undefined anzeigt. Wenn Sie etwas ein zweites Mal auswählen, funktioniert es.

Weiß jemand, warum das in Firefox nicht funktioniert, und vor allem, wie ich es lösen kann? Alle Tipps sind willkommen!

+0

Ich habe versucht, Ihre Plunker in Chrome und FF. Beide scheinen gut zu funktionieren. Es gibt Zeiten, wenn das Modell mit einem Klick außerhalb des TypeAhead in FF "nicht ausgewählt" werden kann.Das Modell ist also korrekt gebunden, aber dann nicht gebunden. In dem Moment, in dem ich die "Senden" -Schaltfläche mit der getroffenen Auswahl drücke, erscheint dieser Fehler erst wieder, wenn ich eine andere Auswahl getroffen habe. –

+0

@DaveAlperovich - Alles klar, wüsstest du, wie wir das Modell bei der Verwendung von Firefox beibehalten können? – kramer65

+0

Noch nicht. Sehr merkwürdiges Verhalten. Der Model Parser wird ausgelöst, was bedeutet, dass das Click-Ereignis irgendwie einen Digest-Zyklus startet (bereits ungerade) und den aktuellen Index für einen Wert verwendet. Beide sind sehr bizarr. Ich kann kein gebundenes Ereignis finden, das dem noch entspricht. –

Antwort

4

Dies war ein interessantes Dilemma.

  • der typeahead den ng-model Wert an ein Objekt einmal

  • Auf jeden Fall (wie Klick) ausgewählten Gruppen, die den Digest-Zyklus ausgeführt wird, erzwingt das Framework die ng-model Bindung des Modellwert einer Zuordnung Zeichenfolge, die an die Eingabe gebunden ist.

  • FireFox, im Gegensatz zu Chrome scheint dieses Verhalten zu erzwingen. Chrome Eingänge ermöglichen wahrscheinlich Objekt Wert Einstellung (nur eine Vermutung).


Die Arbeit rund um Ihren Ausgang Bindung zu ändern:

<input class="typeahead" sf-typeahead type="text" datasets="userDataset" 
outputval="searchUser" ng-model="a" options="exampleOptions"> 

Die outputval ist unser Erwartungswert. Ich bin an eine zufällige Bereichsvariable a gebunden, weil die Direktive eine Modellbindung erwartet und verwendet.

In der Richtlinie habe ich die Funktion updateScope geändert, um den ausgewählten Wert auf scope.outputval festzulegen und die Zuweisung zu Model auskommentiert.

function updateScope (object, suggestion, dataset) { 
     scope.$apply(function() { 
     var newViewValue = (angular.isDefined(scope.suggestionKey)) ? 
      suggestion[scope.suggestionKey] : suggestion; 
     console.log(newViewValue);  
     //ngModel.$setViewValue(newViewValue); 
     scope.outputval = newViewValue; 
     }); 
    } 

Versuchen Sie, meine Plunker!

Verwandte Themen