2016-04-18 3 views
0

Ich benutze UI-Grid und ich habe einige komplexe Daten, die ich versuche, einen Filter auf ihre einzelnen Filter Beispiel anzuwenden. Wenn ich einfache Selektoren verwende, funktioniert alles super. In der Sekunde, in der ich versuche, eine Ebene tiefer in andere Daten innerhalb desselben Knotens zu gehen, hört es auf zu arbeiten.UI-Grid Einzelfilter funktioniert nicht mit komplexen Daten?

Mein plnkr ist here

Hier ist meine Filter Func. Wenn ich etwas ändern ‚address.state‘ auf ‚E-Mail‘ würde es anfangen zu arbeiten:

$scope.singleFilter = function(renderableRows){ 
    var matcher = new RegExp($scope.filterValue); 
    renderableRows.forEach(function(row) { 
     var match = false; 
     [ 'name', 'company', 'address.state' ].forEach(function(field){ 
     if (row.entity[field].match(matcher)){ 
      match = true; 
     } 
     }); 
     if (!match){ 
     row.visible = false; 
     } 
    }); 
    return renderableRows; 
    }; 

hier ein Knoten aus dem data.json ist, so dass Sie ein Gefühl für die Datenstruktur erhalten können:

{ 
    "id": 0, 
    "guid": "de3db502-0a33-4e47-a0bb-35b6235503ca", 
    "isActive": false, 
    "balance": "$3,489.00", 
    "picture": "http://placehold.it/32x32", 
    "age": 30, 
    "name": "Sandoval Mclean", 
    "gender": "male", 
    "company": "Zolavo", 
    "email": "[email protected]", 
    "phone": "+1 (902) 569-2412", 
    "address": { 
     "street": 317, 
     "city": "Blairstown", 
     "state": "Maine", 
     "zip": 390 
    }, 
    "about": "Fugiat velit laboris sit est. Amet eu consectetur reprehenderit proident irure non. Adipisicing mollit veniam enim veniam officia anim proident excepteur deserunt consectetur aliquip et irure. Elit aliquip laborum qui elit consectetur sit proident adipisicing.\r\n", 
    "registered": "1991-02-21T23:02:31+06:00", 
    "friends": [ 
     { 
      "id": 0, 
      "name": "Rosanne Barrett" 
     }, 
     { 
      "id": 1, 
      "name": "Nita Chase" 
     }, 
     { 
      "id": 2, 
      "name": "Briggs Stark" 
     } 
    ] 
}, 

Antwort

1

Sie können nicht mehrere Ebenen eines Arrays mit Bracket-Notation auswählen, daher Ihr Fehler; Die Klammernotation entspricht der Punktnotation. Sie könnten eine Funktion entwerfen, die mehrere Ebenen von Intervallen durchkämmt (wie this SO answer), oder einfach eine weitere if Bedingung hinzufügen, um zu prüfen, ob das Feld einen Punkt enthält, und split verwenden, um daraus ein Array zu machen. Wenn Sie nur ein paar Elemente in Ihrem Array haben, ist letzteres wahrscheinlich einfacher.

[ 'name', 'company', 'address.state' ].forEach(function(field){ 
    if (field.indexOf('.') !== '-1') { 
     field = field.split('.'); 
    } 
     if (row.entity.hasOwnProperty(field) && row.entity[field].match(matcher) || field.length === 2 && row.entity[field[0]][field[1]].match(matcher)){ 
      match = true; 
     } 
     }); 
+0

Ich habe versucht, diesen Code in meine PLNKR zu setzen und es wirft immer noch einen Fehler, können Sie bitte die ganze app.js posten, so dass ich sehen kann, wo Sie es setzen? Vielen Dank! –

+0

Es gab einen Tippfehler und einen Fehler in der 'if' Bedingung, um zu überprüfen, ob' match' '' true' ist, meine Entschuldigung. Ich habe den Code aktualisiert und es sollte jetzt funktionieren. Es sollte in den gleichen Abschnitt gehen, in dem es sich momentan in der Datei 'app.js' befindet. – litel

+0

Dieser Fix hat den Trick gemacht, genau wonach ich gesucht habe. Vielen Dank! :) –

Verwandte Themen