* ngFor необходимо предусмотреть 1 бит для каждого отдельного объекта, но поместить аналогичное значение объекта в тот же бит - PullRequest
0 голосов
/ 05 июля 2019

Я создаю приложение, которое будет перечислять классы для учителя в выбранный день, каждый класс - кнопка на экране. Этот список составлен с использованием *ngFor и извлекает данные из файла ts, который изначально был получен из запроса PHP / базы данных.

Затем учитель будет нажимать кнопку, чтобы показать, какие ученики должны быть в классе в этот день. Это приложение для мониторинга посещаемости / отсутствия.

Однако я тестирую *ngFor, чтобы составить свой список, и поскольку данные хранятся в виде 3 объектов, каждый с информацией для учащегося, три кнопки динамически создаются *ngFor - когда на самом деле, так как три ученика находятся в одном классе, мне нужна всего одна кнопка.

Следующую кнопку нужно будет создать только для следующего урока учителя в тот день.

Я полагаю, что это проблема алгоритма, или, возможно, нужно выполнить другой запрос для получения данных из SQL. Я не знаю.

Я потерян.

HTML

<ion-list>
    <ion-card padding *ngFor="let cour of planning; let i = index" (click)="showStudents($event, i)">
        <h2>{{ cour.cours }}</h2>
        <p>{{ cour.time }}</p>
        <p>{{ cour.date }}</p>
        <p>{{ cour.lieux }}</p>
        <p>{{ cour.duration }}</p>
    </ion-card>
</ion-list>

Услуги

getCoursList(date, idIntervenant) {
    return this.http.post('http://localhost/Attendance App/myApp/src/app/api/getCours.php?id='+idIntervenant,
        { date, }).subscribe(data => {
            console.log(Object.values(data));
            let planningData = Object.values(data);
            const grabArray = planningData[0];
            const id = grabArray.intervenant;
            if (id !== undefined) {
                // console.log('test array', id);
                let navExtras: NavigationExtras = { 
                state: {
                    planning: planningData
                }
                }
                this.router.navigate(['/cours/', id], navExtras);
            };
    },
    error => {
        console.log(error);
    });
}

PHP-запрос к базе данных

if (isset($_POST["date"])) {
    // $id = $_POST["id"];
    $origDate = date("Y-m-d", strtotime($_POST['date']));
    $date = $origDate;
    $id = $_GET['id'];

    $stmt = $conn->prepare("SELECT * FROM planning WHERE intervenant = :id AND date = :date");
    $stmt->execute([':id' => $id, ':date' => $date]);

    if ($stmt->rowCount() > 0) {
        $output = array();
        $output = $stmt->fetchAll();
        echo json_encode($output);
    } else {
        $errors = "No data found for this date";
        echo json_encode($errors);
    }
    // $conn->close();
}

Данные, полученные из запроса PHP - 1 массив, содержащий 3 объекта

[object Array]: [Object, Object, Object]

0: Object
cours: "Suivi individuel"
date: "2019-07-06"
duration: "1h30"
etudiant: "james ross"
id_planning: 19
intervenant: "2"
lieux: "Nice 2"
time: "12:00"

__proto__: Object

1: Object
cours: "Suivi individuel"
date: "2019-07-06"
duration: "1h30"
etudiant: "Tupac Shakur"
id_planning: 20
intervenant: "2"
lieux: "Nice 2"
time: "12:00"

__proto__: Object


2: Object
cours: "Suivi individuel"
date: "2019-07-06"
duration: "1h30"
etudiant: "Joyner lucas"
id_planning: 21
intervenant: "2"
lieux: "Nice 2"
time: "12:00"

__proto__: Object
length: "3"

Все трое учеников идут в один и тот же класс в одно и то же время и т.д., поэтому я хочу, чтобы динамически создавалась только одна кнопка.

Если бы у учителя был второй урок в тот день, он бы выпустил вторую кнопку и т. Д.

В настоящее время нет сообщений об ошибках, просто я не получаю желаемый результат.

1 Ответ

2 голосов
/ 05 июля 2019

Похоже, вам может понадобиться структурировать вашу базу данных по-другому. Вместо того, чтобы иметь строку для каждого студента в Таблице планирования, рассмотрите возможность перехода к следующей структуре:

Table Student:
- studentId
- name

Table Teacher:
- teacherId
- name

Table Class:
- classId
- name
- description
- schedule (not sure what the format of this would be,
    but using it your code should be able to determine the next meeting of the class)

Table Registration (each row in this table represents a student enrolled in the class):
- classId
- teacherId
- studentId

Тогда ваш запрос становится SELECT * FROM Class WHERE teacherId=X X, будучи зарегистрированным учителем. Это даст вам полный список классов, которые есть у учителя.

Чтобы получить список учеников в определенном классе, вы можете сделать: SELECT * FROM Registration WHERE classId=Y AND teacherId=X Y - один из идентификаторов классов, полученных из предыдущего запроса.

Надеюсь, это поможет вам двигаться в правильном направлении!

...