Stefano De Rosso Stefano De Rosso - 5 months ago 25
AngularJS Question

Ng-click and ng-show Angular JS

I have a list of dictionaries, and I want to toggle show all the students and their details for each classroom.


This is the HTML

<div ng-app="myApp" ng-controller="myCtrl">

<div class="classrooms-details" ng-show="Students">
<table class="table table-striped">
<thead>
<tr>
<th>First name</th>
<th>Last name</th>
<th>Gender</th>
<th>Birthday</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="classroom in classrooms">
<td>{{classroom.student.first_name}}</a></td>
<td>{{classroom.student.last_name}}</td>
<td>{{classroom.student.gender}}</td>
<td>{{classroom.student.birthday}}</td>
</tr>
</tbody>
</table>
</div>

<table class="table table-striped">
<thead>
<tr>
<th>Classroom</th>
<th>School</th>
<th>Academic year</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="classroom in classrooms">
<td><a href="#" ng-click="showStudents">{{classroom.classroom}}</a></td>
<td>{{classroom.school.school_name}}</td>
<td>{{classroom.academic_year}}</td>
</tr>
</tbody>
</table>

</div>


I've tried to use ng-click/ng-show, but it's not working.

And this is the script

var app = angular.module("myApp", []);

app.controller("myCtrl", function($scope) {
$scope.classrooms = [{
"school": {
"id": 1,
"school_name": "IPSIA F. Lampertico",
"address": "Viale Giangiorgio Trissino, 30",
"city": "Vicenza"
},
"academic_year": "2015/2016",
"classroom": "1^A",
"floor": 0,
"students": [{
"classroom": 1,
"first_name": "Stefano",
"last_name": "Rossi",
"gender": "M",
"birthday": "1998-06-22"
}, {
"classroom": 1,
"first_name": "Luca",
"last_name": "Possanzini",
"gender": "M",
"birthday": "1999-11-22"
}]
}, {
"school": {
"id": 2,
"school_name": "ITIS A. Rossi",
"address": "Via Legione Gallieno, 52",
"city": "Vicenza"
},
"academic_year": "2015/2016",
"classroom": "2^B",
"floor": 0,
"students": [{
"classroom": 2,
"first_name": "Sergio",
"last_name": "Lazzari",
"gender": "M",
"birthday": "2001-01-29"
}]
}];
console.log($scope.classrooms);
});


I don't know how to access "students" values, and I'd like the students details to be shown only when clicking on the classroom name.

How could I do?

Answer

You just need to set a specific classroom as the "active" classroom and display the students within. The easiest way to do this would be something like:

View

<tr ng-if="activeClassroom" ng-repeat="student in activeClassroom.students">
  <td>{{student.first_name}}</a></td>
  <td>{{student.last_name}}</td>
  <td>{{student.gender}}</td>
  <td>{{student.birthday}}</td>
</tr>

...

<tr ng-repeat="classroom in classrooms">
  <td><a href="#" ng-click="setActiveClassroom(classroom)">{{classroom.classroom}}</a></td>
  <td>{{classroom.school.school_name}}</td>
  <td>{{classroom.academic_year}}</td>
</tr>

Controller

$scope.activeClassroom = null;

$scope.setActiveClassroom = function (classroom) {
  $scope.activeClassroom = classroom;
};