Observes the created container for provided queries and notifies the consumer if a query is matching or not. Use the observe with a query to start monitoring. The queries have the same syntax as the browsers media queries (e.g.: (min-width: 300px)).

Note: Only min-width, max-width, min-height and max-height are supported.

<dt-container-breakpoint-observer>
  <p>This is some placeholder text</p>
  <button dt-button>Some button</button>
</dt-container-breakpoint-observer>

Experimental

Why is it experimental:

  • As this component heavily uses the Intersection Observer and some overlaying elements we do not have to rely on the browser's resize event and should therefor theoretically get much better performance. We still want to monitor the use-cases and performance figures before we fully introduce this feature.
  • This component just now has one method where you can monitor a media query. More directives and APIs are planed to make it easier to use it.
  • Proper UI testing is still missing.

Imports

You have to import the DtContainerBreakpointObserverModule when you want to use the <dt-container-breakpoint-observer>.

@NgModule({
  imports: [DtContainerBreakpointObserverModule],
})
class MyModule {}

Methods

Name Params Return type Description
observe string | string[] Observable<DtBreakpointState> Start observing the container with the provided media query/queries. The observable will provide you a DtBreakpointState object which tells you if all media queries are currently matching (or not) and which of the individual breakpoints are matching.

dtIfContainerBreakpoint directive

A structural directive, much like Angulars ngIf, that takes a container media query (or multiple) and whenever the breakpoint observer matches this query it renders the template provided in the then, or when false renders the template provided in an optional else clause.

Important notice: This directive needs a dt-container-breakpoint-observer to work, because it passes the provided query to the observer and evaluates every-time the observed query changes state.

Inputs

Name Type Description
dtIfContainerBreakpoint query: string | string[] The query to observe and evaluate as the condition for showing a template.
dtIfContainerBreakpointThen TemplateRef<DtIfContainerBreakpointContext> | null A template to show if the breakpoint does match.
dtIfContainerBreakpointElse TemplateRef<DtIfContainerBreakpointContext> | null A template to show if the breakpoint does not match.

Example:

<dt-container-breakpoint-observer>
  <p>This element is alway visible</p>
  <p *dtIfContainerBreakpoint="'(min-width:400px)'">
    This element is only visible if the container has at least a width of 400px
  </p>
</dt-container-breakpoint-observer>

Using the then template:

<dt-container-breakpoint-observer>
  <p>This element is alway visible</p>
  <p *dtIfContainerBreakpoint="'(min-width:400px)'; else elseBlock">
    This element is only visible if the container has at least a width of 400px
  </p>
  <ng-template #elseBlock>
    <p>This element is visible if the container is smaller than 400px</p>
  </ng-template>
</dt-container-breakpoint-observer>

Responsive Table

Using the breakpoint observer creating a responsive table got easier:

<dt-container-breakpoint-observer>
  <dt-table [dataSource]="dataSource">
    <ng-container dtColumnDef="host" dtColumnAlign="text">
      <dt-header-cell *dtHeaderCellDef>Host</dt-header-cell>
      <dt-cell *dtCellDef="let row">{{ row.host }}</dt-cell>
    </ng-container>
    <ng-container dtColumnDef="cpu" dtColumnAlign="text">
      <dt-header-cell *dtHeaderCellDef>CPU</dt-header-cell>
      <dt-cell *dtCellDef="let row">{{ row.cpu }}</dt-cell>
    </ng-container>
    <ng-container dtColumnDef="memory" dtColumnAlign="number">
      <dt-header-cell *dtHeaderCellDef>Memory</dt-header-cell>
      <dt-cell *dtCellDef="let row">{{ row.memory }}</dt-cell>
    </ng-container>
    <ng-container dtColumnDef="traffic" dtColumnAlign="control">
      <dt-header-cell *dtHeaderCellDef>Network traffic</dt-header-cell>
      <dt-cell *dtCellDef="let row">{{ row.traffic }}</dt-cell>
    </ng-container>
    <ng-container dtColumnDef="details" dtColumnAlign="text">
      <dt-header-cell *dtHeaderCellDef>Details</dt-header-cell>
      <dt-expandable-cell *dtCellDef></dt-expandable-cell>
    </ng-container>
    <dt-header-row *dtHeaderRowDef="_headerColumns"></dt-header-row>
    <dt-row
      *dtRowDef="
          let row;
          columns: ['host', 'cpu', 'memory', 'traffic'];
          let rowIndex = index;
          when: !_isTableNarrow
        "
    ></dt-row>
    <dt-expandable-row
      *dtRowDef="
          let row;
          columns: ['details', 'host', 'cpu'];
          let rowIndex = index;
          when: _isTableNarrow
        "
    >
      <ng-template dtExpandableRowContent>
        <dt-key-value-list>
          <dt-key-value-list-item>
            <dt-key-value-list-key>Memory</dt-key-value-list-key>
            <dt-key-value-list-value>{{ row.memory }}</dt-key-value-list-value>
          </dt-key-value-list-item>
          <dt-key-value-list-item>
            <dt-key-value-list-key>Traffic</dt-key-value-list-key>
            <dt-key-value-list-value>{{ row.traffic }}</dt-key-value-list-value>
          </dt-key-value-list-item>
        </dt-key-value-list>
      </ng-template>
    </dt-expandable-row>
  </dt-table>
</dt-container-breakpoint-observer>