2016-04-05 8 views
0

Ich habe eine Elternliste mit einem Dropdown-Kästchen, das Sie sehen können, wenn Sie auf die Liste klicken. Ich möchte die Elternlistenklasse "aktiv" geben, wenn eines der Kontrollkästchen aktiviert ist. Was jetzt passiert, ist, dass ich mehrere Listen habe. Wenn das Kontrollkästchen aktiviert ist, erhalten alle Listen diese Klasse, wenn ich nur die Liste der Kontrollkästchen haben möchte, um die "aktive" Klasse zu erhalten. Wie kann ich dies umgestalten, so dass nur die "aktive" Klasse der übergeordneten Liste zugewiesen wird, nicht alle Listen?Wenden Sie ng-class auf das übergeordnete Element an, wenn auf ein Kontrollkästchen mit Angular geklickt wird?

HTML:

<ul ng-repeat="type in filterTypes"> 
    <li ng-repeat="filter in type.filters" ng-class="{active:checked}">{{filter.value | uppercase}} 
     <ul> 
      <li ng-repeat="option in filter.options"> 
       <label> 
        //if any checkbox is checked, the active class should be given to the parentd list at the way top. 
        <input type="checkbox" ng-model="checked"/> 
        {{option}} 
       </label> 
      </li> 
     </ul> 
    </li> 
</ul> 

Richtlinie:

return { 
    restrict: "E", 
    templateUrl: 'scripts/directives/all-filters.html', 
    link: function(scope, el, attr) { 
     scope.filterTypes = dummyData.filters; 
    } 
} 
+0

ändern 'checked' zu' Filter. geprüft "in den Modell- und Klassenrichtlinien. –

+0

@JamesBuck Dadurch werden alle Kontrollkästchen aktiviert (true). –

Antwort

1

die geprüfte Eigenschaft auf jede Option Nehmen durch das Modell ng-model="option.checked"

Dann auf dem li Element der Wechsel ändern ng-class Direktive zum Aufrufen eines Funktion zu überprüfen, ob eine Option innerhalb des Filters geprüft

$scope.isAnyChecked = function(filter) { 
    for (var i = 0; i < filter.options.length; i++) { 
     if (filter.options[i].checked) { 
      return true; 
     } 
    } 
    return false; 
} 

dann die aktive Klasse gelten, wenn es liefert true

ng-class="isAnyChecked(filter) ? 'active' : ''" 
+0

Wie prüft es, ob der Filter überprüft wird, wenn die Filter die Eigenschaft "checked" bereits nicht haben ... Ich bekomme diesen Fehler: Kann die Eigenschaft 'checked' in der Zeichenfolge 'filter1' nicht erstellen –

+0

@ user5694093 Sie müssen Ändern Sie "Optionen" so, dass sie ein Array von Objekten anstelle eines Arrays von Strings darstellen. Wenn das nicht möglich ist, müssen Sie eine neue Eigenschaft auf dem Filter erstellen, um den Modellwert jedes Kontrollkästchens zu speichern und die Funktion 'isAnyChecked' entsprechend anzupassen. –

+0

Danke! Ich habe die Optionen zu Objekten gemacht. Funktioniert jetzt gut. Würdest du sagen, dass dies der geeignetste Winkelweg ist? –

0

<input ng-model='checked' ng-change='filter.checked=checked'/>

+0

das wird nicht funktionieren, denn sobald ich ein anderes Kontrollkästchen anklicke, wird der Wert "checked" auf false gesetzt, wodurch die Klasse "active" verschwindet. Ich möchte die Klasse "aktiv" halten, solange eines der Kästchen aktiviert ist. –

Verwandte Themen