2017-01-11 3 views
1

Ich versuche Splice Elemente aus einem Array, aber es entfernt jedes Mal das falsche Element. Ich glaube, das ist, weil ich das Array Array mit OrderBy filter, also das Array auf dem DOM unterscheidet sich von dem Array in der Steuerung. Meine Frage ist nun, wie kann ich das richtige Element korrekt aus dem Array spleißen, auch nach dem Filtern, und gibt es auch eine Möglichkeit, wie ich den orderBy-Filter vom Controller verwenden kann?Array spleißt das falsche Element im Winkel während ng wiederholen

Heres mein Controller

office.controller('notificationCtrl',['$scope',$http',function($scope,$http){ 

    $scope.latest = [ 
     { 
      id:1, 
      date : "2017-01-11T19:33:17.307452", 
      arrived: false, 
      location : "europe" 
     }, 
     { 
      id: 2, 
      date: "2017-01-11T20:19:47.745673", 
      arrived:false, 
      location : "africa" 
     } 

    ] 

    $scope.accept = function(array,index){ 
     array.splice(index,1) 
    } 
}] 

source.html

<div ng-repeat="recent in latest | orderBy : recent.date : true"> 
    <button ng-click="accept(latest,$index)">Accept</button> 
</div> 

EDIT Ich habe Beispieldaten hinzugefügt, wie gewünscht, in den obigen Daten, wenn ich versuche, den zweiten Punkt zu spleißen, es Gewürze der erste stattdessen.

+0

Können Sie einige Beispieldaten bereitstellen? –

+0

@PritamBanerjee als Anfrage bearbeitet – HackAfro

Antwort

0

Ich denke, wenn Sie die Spur am Ende hinzufügen, wird es wie erwartet funktionieren. Und yo haben auch einen Fehler in der ersten param, können Sie die Eigenschaft mit Zitaten wie dies darauf hindeuten sollte:

<div ng-repeat="recent in latest | orderBy:'date':true track by $index"> 
    <button ng-click="accept($index)">Accept</button> 
</div> 

Ihr Controller:

$scope.accept = function(index){ 
    $scope.latest.splice(index,1) 
} 

So verwenden Sie Filter in Ihrem Controller:

var orderedArray= $filter('orderBy')($scope.latest, 'date'); 
+0

Ich habe versucht, es funktioniert immer noch nicht. Die Verwendung des Filters im Controller ist schwierig, da ich mit einer der Array-Eigenschaften filtere. Z.B. zuletzt in den letzten | orderBy: 'kürzlich.Datum ': wahr. Kann das im Controller gemacht werden? – HackAfro

+0

Was versuchen Sie zu erreichen, indem Sie die neuesten senden? –

+0

Ich versuche, die Elemente mit dem letzten Datum zu bestellen – HackAfro

1

Wie hier geschrieben https://docs.angularjs.org/api/ng/directive/ngRepeat können Sie variable in expression as alias_expression verwenden, um die Zwischenergebnisse des Repeaters nach der Bestellung/Filterung zu erhalten/speichern.

Variable in Ausdruck als alias_expression - Sie können auch einen optional alias Ausdruck bereitzustellen, die dann die Zwischen Ergebnisse des Repeaters gespeichert werden, nachdem die Filter angewendet wurden. In der Regel Dies wird verwendet, um eine spezielle Nachricht zu rendern, wenn ein Filter auf der Repeater aktiv ist, aber die gefilterte Ergebnismenge ist leer.

Zum Beispiel: Artikel in Artikeln | filter: x als Ergebnis speichert das Fragment der wiederholten Elemente als Ergebnisse, aber erst nachdem die Elemente durch den Filter verarbeitet wurden.

Bitte beachten Sie, dass `als [Variablenname] keinen Operator, sondern ein Teil ngRepeat Mikro-Syntax, so dass es erst am Ende verwendet werden kann (und nicht als Operator innerhalb eines Ausdrucks).

Zum Beispiel: Artikel in Artikeln | Filter: x | orderBy: Bestellung | limitTo: als Ergebnis einschränken.

+0

setzen Wenn Sie mich nicht fragen, fragen. Wie benutze ich das um mein Problem zu lösen? – HackAfro

+0

Wenn Sie aus Ihrem Array löschen, übergeben Sie den $ index innerhalb der gefilterten Ergebnisse an das nicht gefilterte Quell-Array. Deshalb löscht es das falsche Element. Sie sollten 'ng-click =" accept (alias_ausdruck, $ index) "', wobei 'alias_expression' das resultierende (geordnete und gefilterte) Array ist. –

0

So löste ich dies einfach wie meine Liste Umkehren

var latest = [ 
    { 
     id:1, 
     date : "2017-01-11T19:33:17.307452", 
     arrived: false, 
     location : "europe" 
    }, 
    { 
     id: 2, 
     date: "2017-01-11T20:19:47.745673", 
     arrived:false, 
     location : "africa" 
    } 

] 

$scope.latest = latest.reverse() 

Dann entfernte ich die Filter und gerade tat ng-Wiederholung auf der Liste.

<div ng-repeat="recent in latest"> 
    <button ng-click="accept($index)">Accept</button> 
</div> 
Verwandte Themen