2016-05-06 3 views
2

Ich habe eine Situation, in der ich eine dynamische Tabelle erstellen, in der Zellen ein Datenaggregat mit mehreren ng-if-Anweisungen enthalten. Grundsätzlich muss ich wissen, ob keine der if-Anweisungen wahr ist, also kann ich einen anderen ng-if tun.Winkelprüfung für eine oder mehrere ng-if-Anweisungen ist true

Dies ist ein vereinfachtes Beispiel für das, was ich mache. Es gibt ungefähr 20 Spalten mit unterschiedlichen aggregierten Ergebnissen.

<table> 
    <tr ng-repeat="record in data"> 
     <td> 
      <span ng-if="record.some_number > 0 && record.type == 'SomeType'">{{data1}}</span> 
      <span ng-if="record.age >= 20 && record.age <= 50 && record.gender == 'MALE'">{{data2}}</span> 
      <span ng-if="(record.age <= 20 || record.age >= 50) && record.gender == 'FEMALE'">{{data3}}</span> 
      <span ng-if="!(record.some_number > 0 && record.type == 'SomeType') && !(record.age >= 20 && record.age <= 50 && record.gender == 'MALE') && !((record.age <= 20 || record.age <= 50) && record.gender == 'FEMALE')">{{data4}}</span> 
     </td> 
    </tr> 
<table> 

ich einen ng-Schalter nicht, weil die Bedingungen ganz andere sind verwenden können. Dies ist eine Zusammenfassung von Daten, nicht wenn/sonst. Ich bevorzuge eine andere Herangehensweise als einfach ein '!' zu jeder Bedingung in einem anderen Bereich, weil einige meiner Aggregate viele Bedingungen enthalten und einige der if-Anweisungen nicht trivial sind. Es gibt auch viele Aggregatzellen, so dass die Wartung der allzu komplizierten "anderen" Bedingungen ein Albtraum wäre.

Idealerweise würde ich gerne nur in der Lage sein, eine einzige Variable True auf jede ng-if-Anweisung zuzuweisen, die wahr ist. Irgendwelche Gedanken?

+1

Sie sollten eine Variable für '$ scope' erstellen, die Sie Ihren Bedingungen zuordnen können, anstatt alle Prüfungen im JS durchzuführen. – SoluableNonagon

+0

Ja. Genau das möchte ich tun, bin mir aber nicht sicher, wie das mit ng-if-Anweisungen funktioniert. Ich nehme an, der einzige Weg, das zu tun, ist in meinem Controller. Das ist nicht ideal, denn dann muss ich meine Bedingungen an zwei Stellen aufrechterhalten. – Gremash

+0

Ich werde Ihnen ein Beispiel in einer Antwort zeigen – SoluableNonagon

Antwort

1

Ich weiß nicht, dass es eine Best Practice ist, aber ich glaube, Sie sollten Ihre ganze Logik in Ihrem JS haben, und der HTML sollte nur eine Vorlage sein, die den Zustand des angezeigten Bereichs widerspiegelt.

Auf diese Weise würden Ihre Bedingungen IMMER in Ihrem JS überprüft werden.

UPDATE: auf der Grundlage neuer Inhalt:

So haben Sie Daten und wie es aussieht, was Sie brauchen, sie zu verarbeiten zuerst, sonst Ihre App-Leistung wird mit einer Überlastung der Beobachter leiden.

Erstens: vereinfachen Sie Ihre HTML, all die Logik wie record.some_number > 0 && record.type == 'SomeType'" gehört in die JS.

<table> 
    <tr ng-repeat="record in data"> 
     <td> 
      <span ng-repeat="item in record.dataToShow" ng-bind-html='item'></span> // now you just repeat the data that has been processed 
     </td> 
    </tr> 
</table> 

Zweitens: Machen Sie die Verarbeitung in Ihrem JavaScript in einer Schleife.

$scope.data = [ some array with lots of stuff ]; 

for(var idx in $scope.data){ 
    var record = $scope.data[ idx ]; // assuming JSON object 
    var dataToShow = []; // store your data(s) in an array 

    // if a condition is met, push your data onto the array 
    if(record.some_number > 0 && record.type == 'SomeType'){ 
     dataToShow.push(data1); 
    } 
    if(record.age >= 20 && record.age <= 50 && record.gender == 'MALE'){ 
     dataToShow.push(data2); 
    } 
    // continue processing conditions 

    if(dataToShow.length === 0){ // none have been true if array is empty 
     // do something 
    } 
    record.dataToShow = dataToShow; 
} 

https://plnkr.co/edit/ZPbui4rLwGGVVD4B90b9?p=preview

+0

Gibt es keine Möglichkeit, dies auf der HTML-Seite zu tun? Das ist eine Menge Refactoring in meiner Anwendung. – Gremash

+0

Nicht wirklich, sorry für den Ärger, ich hasse es zu sagen, aber es sollte sehr wenig Logik in der HTML wenn überhaupt. Wenn Sie die Seite umgestalten müssen, sollten Sie es tun, damit Sie später leichter warten können. – SoluableNonagon

+0

Die andere Schwierigkeit besteht darin, dass diese alle Teil einer HTML-Tabelle sind, die ng-repeat verwendet. – Gremash

0

eine Scope-Funktion Erhalten Sie zu entscheiden, wie ng-wenn für verschiedene Bedingungen zu behandeln.

<span ng-if="showHideCell(this)">{{data1}}</span> 
<span ng-if="showHideCell(this)">{{data2}}</span> 

Und in Ihrem Controller ..

$scope.showHideCell = function(ele) { 

    //Your complex condition here 

    return decition; // true or false 
} 

Wird der Antrag auf Durchsatz kritisch und viele Kontrollen hat, würde ich vorschlagen SoluableNonagon Methode in seiner Antwort mit. Dort würde jeder Verdauungszyklus nur nach einer Variablen suchen.

+0

Ich würde nicht empfehlen, eine Funktion zu einem ng-wenn, während dies funktioniert es läuft auch bei jedem Verdauungszyklus und nicht nur bei einem Ereignis. – SoluableNonagon

+0

Danke. Antwort aktualisiert –

0

Sie könnten eine generische Methode in Ihrem Controller verwenden, um nach Ihren Bedingungen für Elemente zu suchen, während Sie eine andere haben können, die für alle gilt und im Wesentlichen die oben erwähnte generische Methode aufruft.

Here ist ein Plunk etwas zu tun, was Sie erreichen möchten, könnte Ihnen eine Idee geben.

Was ich hier mache, ist, zum Beispiel zwei Arrays zu haben, eins mit ungeraden Werten und eins mit geraden Werten. Ich habe eine Methode condition auf dem Controller, der einen Wert (erhält den Wert des Arrays von ng-repeat Schleife) und eine all-Methode, die die condition ruft.

$scope.condition = function(element, value) { 
    // Just returns true for even values 

    if (typeof value === "number") 
     return value % 2 == 0; 
    else if (value instanceof Array) { 
     return value.every(function(item) { 
     return item % 2 == 0; 
     }); 
    } 

    } 

    $scope.all = function(element, value) { 
    return $scope.condition(element, value); 
    } 

Sie können an einem ähnlichen Ansatz arbeiten.

Verwandte Themen