2016-03-30 9 views
2

nur eine schnelle Frage!

Ich habe eine Ordnungsfunktion, die je nach Situation zwei Arrays bestellen soll. Also gebe ich die Array-Referenz, aber das Array wird nicht gefiltert! Irgendwelche Ideen?

function order(rowName, array) { 
    if (vm.row === rowName) { 
     return; 
    } 

    vm.row = rowName; 
    array = $filter('orderBy')(array, rowName); 
    return vm.onOrderChange(); 
}; 

die in meinem html wie genannt wird:

data-ng-click = "vm.order('amount', vm.itemsNew)" 

es ich habe wie unten arbeiten, aber ... na ja, ich mag es nicht!

function order(rowName, array) { 
    if (vm.row === rowName) { 
     return; 
    } 

    vm.row = rowName; 
    if (array === vm.itemsNew) 
     vm.itemsNew = $filter('orderBy')(vm.itemsNew, rowName); 
    else 
     vm.itemsGeneric = $filter('orderBy')(vm.itemsGeneric, rowName); 
    return vm.onOrderChange(); 
}; 
+0

Können Sie jede Geige/plnkr hinzufügen? –

+1

Muss das Array überhaupt übergeben werden? Kann 'order' auch für andere Arrays aufgerufen werden? – zeroflagL

+0

@zeroflagL Ursprünglich musste ein Array sortiert werden, so dass kein zweites Argument in der Funktion benötigt wurde. Aber dann wurde ein neues notwendig, also dachte ich nur, dass ich einen Verweis auf das Array weitergeben sollte, das ich stattdessen sortieren möchte. –

Antwort

0

ng-click können Sie nicht nur eine Funktion aufrufen, sondern auch beliebige Ausdrücke auswerten. So können Sie das gefilterte Array aus Ihrer Funktion zurückzukehren, und weisen Sie das Modell:

data-ng-click = "vm.itemsNew = vm.order('amount', vm.itemsNew)" 

Die Funktion:

... 
array = $filter('orderBy')(array, rowName); 
vm.onOrderChange(); 
return array; 
1

Diese Zeile versucht, den Verweis auf array zu ändern, was ein Argument der Funktion ist.

array = $filter('orderBy')(array, rowName); 

Einfache Antwort ist, dass Sie Originalreferenz innerhalb der Funktion nicht ändern können. Deshalb funktioniert vm.itemsNew = $filter('orderBy')(vm.itemsNew, rowName); korrekt.

können Sie mehr hier lesen: Is JavaScript a pass-by-reference or pass-by-value language?

Gute daran ist, dass Sie sehen, dass Ihre Lösung sehr hässlich ist;)

können Sie Filter verwenden, und umschreiben Array wie folgt:

function order(rowName, array) { 
     if (vm.row === rowName) { 
      return; 
     } 

     vm.row = rowName; 
     var tmpArray = $filter('orderBy')(array, rowName); 
     array.length = 0; //clears array 
     angular.forEach(tmpArray, function(item) { // fill array with ordered values from tmpArray. 
      array.push(item); 
     }); 
     return vm.onOrderChange(); 
    }; 

Offensichtlich ist dies aus Sicht der Leistung nicht das Beste. I empfehlen dringend Sie erfahren mehr über das Übergeben von Argumenten an Funktionen in JS. Link oben ist ein guter Ausgangspunkt.