Создайте компонент главной таблицы и динамически добавляйте дочерние столбцы в angular

Доброе утро всем !

Поэтому необходимо создать приложение, которое отображает множество таблиц, которые все выглядят одинаково (за исключением, конечно, их столбцов и объектов внутри).

У меня есть компонент главной таблицы, который можно резюмировать следующим образом:

<master-table>
  <!-- here I define the master table style, pagination, etc etc 
       which is the same everywhere -->
</master-table>

В файле TS компонента главной таблицы у меня есть в основном параметры, которые актуальны для каждой страницы, на которой должна отображаться такая таблица, например, filterDate, clearSelection и т. д. И т. Д., Ничего особенного.

Дело в том, что я не хочу повторять этот код повсюду, потому что в нем нет необходимости, поэтому моя идея заключалась в том, чтобы создать несколько компонентов, которые расширили бы компонент основной таблицы.

Он отлично работает для значений машинописного текста, но я застрял с HTML.

В моей основной таблице HTML я хотел бы в какой-то момент использовать какой-то заполнитель примерно так:

<master-table>
  <standard-for-all-table></standard-for-all-table>

  <!-- insert here child columns -->
</master-table>

В компонентах, расширяющих мою основную таблицу, я тогда представлял себе что-то вроде:

<!-- child component -->
<master-table></master-table>
<child-column>column definition</child-column>

Это позволит мне определить только столбцы в HTML дочерних компонентов, и они будут автоматически добавлены в родительский HTML во время выполнения ...

Есть идеи как это сделать ?

Ура и спасибо!

в основном вам нужен компонент child внутри более общего компонента parent?

Emanuele 10.07.2018 11:40

Я думаю, вы хотите максимально абстрагировать код. Таким образом, одним из вариантов было бы создать больше различных компонентов child-column с желаемой логикой и добавить их к родительскому master-table в зависимости от ваших условий. И вы должны поместить свой тег ссылки на компонент child-column внутри html компонента master-table.

Emanuele 10.07.2018 11:47

Если вам нужен только один <child-column> внутри одного <master-table>, а дочерний элемент динамически изменяет контент в зависимости от условия, вам необходимо создать общую службу (provider) между родительским и дочерним

Emanuele 10.07.2018 12:01

Я в основном позволил сказать, что таблица, и эта таблица имеет TS и связанный с ней HTML, затем у меня есть дети, которые расширяют эту таблицу, например, клиенты, пользователи, дома и т. д. Все они будут использовать эту материнскую таблицу и просто добавлять их собственный столбец, поэтому мне не нужно повторно использовать логику фильтра, добавлять / удалять логику и т.д., что уже сделано в материнской системе. Итак, в конце у меня будет много дочерних столбцов в зависимости от отображаемых дочерних объектов (будь то клиенты, клиенты и т. д.)

Olivier Alves 10.07.2018 13:00

У меня уже есть эти поставщики и разные дочерние элементы, теперь я хотел бы, чтобы ребенок использовал родительский HTML и заполнил его недостающими столбцами, что является последним шагом :) Я не хочу, чтобы все возможные столбцы в моем мастере table, поскольку я не думаю, что это лучший способ, я, конечно, мог бы сделать это и сделать несколько ngSwitch и решить проблему, но, честно говоря, мне не нравится такой подход ...

Olivier Alves 10.07.2018 13:04

Хорошо, теперь я понял вашу проблему. Так что я напишу вам свой ответ. Короче говоря, моя идея состоит в том, чтобы создать общий компонент <child-column> и создать в его структуре html все возможные столбцы td, которые вы могли бы использовать, ввести в него данные на основе ваших потребностей с помощью углового выражения {{data.variable}} и скрыть столбцы, которые вы не делаете. нужно с *ngIf = "variable"

Emanuele 10.07.2018 13:23

Хорошо, спасибо, я постараюсь пойти по этому пути!

Olivier Alves 10.07.2018 14:57
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
7
597
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это руководство взято с официальной угловой страницы Здесь
Вот живой образец этого

Не уверен, что эти ссылки могут помочь. Но на самом деле я работал над проектом, в котором мы хотим динамически загружать дочерний компонент в сетку (родительский компонент). А позже мы можем передать любой компонент с другим видом внутри Grid
. Угадайте, что это довольно близко к вашей цели.

Ответ принят как подходящий

По сути, вам нужно создать свой основной компонент master-table и компонент общего списка chid-column и вставить его в структуру родительского шаблона html.

I've edit the final part hope in a better understanding way...

Затем вы можете структурировать свой дочерний компонент, чтобы он содержал все необходимые вам свойства, и благодаря *ngIf показывать только те свойства, которые вы возвращаете из методов вашего поставщика, то есть getClients(), getUsers(), getHouses(), также благодаря декоратору @Input вы можете вводить эти данные непосредственно из родительского ребенку и создайте множество компонентов, которые захотите, просто изменив данные.

Итак, у вашего родителя может быть что-то вроде

import { Component } from '@angular/core';

import { MY_DATA_FROMP_ROVIDER } from './mydata/provider';

@Component({
  selector: 'master-table',
  template: `
    <ul>
     <child-column *ngFor = "let item of items"
      [item] = "item">
     </app-hero-child>
    </ul>
  `
})
export class MasterTableComponent {
  items:any

  constructor(public data: MYDATAFROMPROVIDER) {
      this.items = MYDATAFROMPROVIDER.myGetMethod();
}

И в твоем ребенке

import { Component, Input } from '@angular/core';

import { INTERFACE } from './mydata/interface';

@Component({
  selector: 'child-column',
  template: `
    <div *ngIf = "item.id">{{item.id}}</div>
    <div *ngIf = "item.name">{{item.name}}</div>
    <div *ngIf = "item.address">{{item.address}}</div>
    <div *ngIf = "item.phone">{{item.phone}}</div>
  `
})
export class ChildColumnComponent {
  @Input() item: INTERFACE;
}

Если хотите глубже: Взаимодействие компонентов

Другие вопросы по теме