2016-03-19 12 views
1

Ich habe die folgende Funktion, die Fälle für mich am Front-End sortiert, die auf einem ng-Klick aufgerufen wird. Der Parameter ist eine Zeichenkette, der Parameter 'asc' wird an vm.sortCases für aufsteigende Sortierungen übergeben und für die absteigende Sortierung 'desc'.

vm.sortCases = function (byValue) { 
     vm.selectedSorting = byValue; 
    }; 

Ich habe eine Uhr wie folgt aufgestellt, die vm.selectedSorting Uhren, die einen String enthält:

$scope.$watch('vm.selectedSorting', filterAndSortingSearch); 

Rückruf für die Uhr:

function filterAndSortingSearch(newValue, oldValue) { 
      if (newValue === oldValue) { 
      return; 
      } 
      fetchData(); 
     } 

Wenn der Benutzer klickt Bei asc zweimal wird die Uhr nur einmal ausgelöst (das erste Mal), warum ist das so, und wie kann ich den Rückruf der Uhren ausführen, auch wenn die gleiche Zeichenfolge übergeben wird? Ich möchte es so, wenn der Benutzer zweimal klickt und "asc" zweimal passiert, wird die Uhr auch zweimal ausgelöst, was jetzt nicht passiert. Ich habe versucht, als dritter Parameter in der Uhr wahr, aber das hat nicht funktioniert. Ich habe auch versucht, die Zeichenfolge wie folgt konvertieren:

vm.sortCases = function (byValue) { 
     var objForEqualityComparison = {sortOrder: byValue} 
     vm.selectedSorting = objForEqualityComparison.sortOrder; 
    }; 

Dies ist, was ich am Ende mit gehen. I umgewandelt, um die Zeichenfolge innerhalb eines Objekts zu sein, und das Objekt anstelle des String-Wert beobachtet:

vm.sortCases = function (byValue) { 
     vm.selectedSorting = {direction: byValue}; 
    }; 

Antwort

0

$watch nur ausgelöst wird, wenn eine Variable ändert Werte:

$watch(watchExpression, listener, [objectEquality]);

Register A Listener-Callback, der ausgeführt wird, wenn sich der WatchExpression ändert. [...] Der Listener wird nur aufgerufen, wenn der Wert aus dem aktuellen watchExpression und der vorherige Aufruf von watchExpression nicht gleich sind (mit Ausnahme des ersten Laufs, siehe unten).

Dies ist durch Design - eine Variable kann im Verlauf einer Berechnung neu eingestellt werden, aber dass es den gleichen Wert am Ende, an welchem ​​Punkt $watch da sonst nichts auf diesem Variablenwert in Abhängigkeit nicht auslösen soll, wird haben sich entweder geändert.

Wenn Sie möchten, dass eine Aktion jedes Mal ausgelöst wird, wenn ein Benutzer auf eine Schaltfläche klickt, sollten Sie onclick oder ng-click verwenden.

+0

Gibt es eine Möglichkeit, die Variable jedes Mal, wenn ein Benutzer klickt, als neu zu betrachten? Ich dachte, eine Konvertierung in ein Objekt würde damit umgehen? Aus anderen Gründen kann ich ng-click in diesem Szenario nicht verwenden – devdropper87

+0

Hmm ja, mache etwas wie 'function AlwaysUnique (s) {this.s = s:}' und bei Klick immer auf 'new AlwaysUnique (" asc ")) ', und stellen Sie sicher, dass die Uhr strenge Gleichheit verwendet. Hacky, aber es sollte funktionieren .. – Claudiu

+0

strenge Gleichheit ist über wahr als der dritte Parameter, richtig? – devdropper87

Verwandte Themen