IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Angular Discussion :

Angular mat-table ng-container to ng-content


Sujet :

Angular

  1. #1
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Points : 367
    Points
    367
    Par défaut Angular mat-table ng-container to ng-content
    Bonjour,

    je cherche à créer un mat-table avec des définitions de colonnes déjà pres défini car utilisés à plusieurs endroits.

    parent Component
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!-- displayedColumns: string[] = ['firstName', 'lastName', 'actions']-->
    <app-table [data]="users" [displayedColumns]="displayedColumns" [busy]="busyLoading">
        <!-- action -->
    <ng-container matColumnDef="actions">
            <th mat-header-cell *matHeaderCellDef>{{'COMMON.ACTION'}}</th>
            <td mat-cell *matCellDef="let row">
            <button type="button" [routerLink]="['/users/' + row.id]">edit</button>
            </td>
        </ng-container>
    
    </app-table>

    app-table component
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <table mat-table [dataSource]="dataSource">
        <ng-container matColumnDef="firstName">
            <th scope="col" mat-header-cell *matHeaderCellDef>{{'USER.FIRST_NAME' | translate}}</th>
            <td mat-cell *matCellDef="let row">{{row.firstName}}</td>
        </ng-container>
    
        <!-- serialNumber -->
    <ng-container matColumnDef="lastName">
            <th scope="col" mat-header-cell *matHeaderCellDef>{{'USER.LASTE_NAME' | translate}}</th>
            <td mat-cell *matCellDef="let row">{{row.lastName}}</td>
        </ng-container>
    
        <!-- what I'm trying to do -->
    <ng-content></ng-content>
    
        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    
    </table>
    <!-- ERROR Error: Could not find column with id "actions" -->


    J'essayes donc de définir certaines colonnes dans un parent, passer ces définitions par le biez de ng-content à l'enfant, en l'occurrence app-table.
    et ensuite affiches ces colonnes comme si le code avait était écrit dans l'enfant, un peu comme si le code passé en paramètre, avait été l'équivalent d'un include d'un morceau de text

    Auriez vous une idée de comment procéder ?

    Merci d'avance

  2. #2
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Points : 367
    Points
    367
    Par défaut
    Voici un nouveau test de projet histoire de rendre la lecture plus complète et plus propre

    parent
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- parent.component.html -->
    <h1>Parent Component</h1>
    <app-user-list [dataSource]="users" [displayedColumns]="displayedColumns">
        <!-- Custom columns for UserListComponent -->
    <ng-container matColumnDef='lastname'>
            <th mat-header-cell *matHeaderCellDef>Last Name</th>
            <td mat-cell *matCellDef="let user">{{ user.lastname }}</td>
        </ng-container>
    </app-user-list>

    Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import { Component, Input } from '@angular/core';
    
    interface User {
        id: number;
        firstname: string;
        lastname: string;
    }
    
    @Component({
        selector: 'app-parent',
        templateUrl: './parent.component.html',
        styleUrls: ['./parent.component.scss']
    })
    export class ParentComponent {
    
        users: User[] = [
            { id: 1, firstname: 'John', lastname: 'Doe' },
            { id: 2, firstname: 'Jane', lastname: 'Smith' },
            { id: 3, firstname: 'Alice', lastname: 'Johnson' },
            { id: 4, firstname: 'Bob', lastname: 'Brown' },
        ];
    displayedColumns: string[] = [
            'id',
            'firstname',
            'lastname'
    ];
    
        constructor() { }
    }
    


    enfant
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <!-- user-list.component.html -->
    <mat-card>
        <mat-card-header>
            <mat-card-title>User List</mat-card-title>
        </mat-card-header>
        <mat-card-content>
            <table mat-table [dataSource]="dataSource">
                <!-- Default columns (ID and First Name) -->
    <ng-container matColumnDef="id">
                    <th mat-header-cell *matHeaderCellDef>ID</th>
                    <td mat-cell *matCellDef="let user">{{ user.id }}</td>
                </ng-container>
                <ng-container matColumnDef="firstname">
                    <th mat-header-cell *matHeaderCellDef>First Name</th>
                    <td mat-cell *matCellDef="let user">{{ user.firstname }}</td>
                </ng-container>
    
                <!-- Custom columns (added using ng-content) -->
    <ng-content select="[matColumnDef='lastname']"></ng-content>
    
                <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
                <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
            </table>
        </mat-card-content>
    </mat-card>

    Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import { Component, Input } from '@angular/core';
    
    
    @Component({
        selector: 'app-user-list',
        templateUrl: './user-list.component.html',
        styleUrls: ['./user-list.component.scss']
    })
    export class UserListComponent {
        @Input() dataSource: any;
        @Input() displayedColumns: string[] = [];
    
        constructor() { }
    }
    


Discussions similaires

  1. angular mat-autocomplete mat-option
    Par totot dans le forum Angular
    Réponses: 0
    Dernier message: 11/08/2019, 19h07
  2. Réponses: 0
    Dernier message: 15/11/2018, 10h10
  3. Réponses: 0
    Dernier message: 10/07/2012, 11h22
  4. [MySQL] Affichage Fichier JOINT (depuis table MySQL type BLOB) header content
    Par encore_php dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/04/2008, 17h57
  5. [XSL-FO] table of content
    Par fxjtarga dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2006, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo