Title ​

Reactive wrapper around Angular Router's route title. Access the resolved route title as a writable signal that can be set to update the page title.

Usage ​

angular-ts
import { Component } from '@angular/core';
import { title } from '@signality/core';

@Component({
  template: `
    <h1>{{ pageTitle() ?? 'Default Title' }}</h1>
  `,
})
export class ProductPage {
  readonly pageTitle = title(); 
}

Parameters ​

ParameterTypeDescription
optionsTitleOptionsOptional configuration (see Options below)

Options ​

The TitleOptions extends CreateSignalOptions<string> and WithInjector:

OptionTypeDefaultDescription
equalValueEqualityFn<string>-Custom equality function (see more)
debugNamestring-Debug name for the signal (development only)
injectorInjector-Optional injector for DI context

Return Value ​

Returns a WritableSignal<string> containing the current route title. The signal can be updated using set() or update() methods, which will also update the page title via Angular's Title service.

Examples ​

Display route title ​

angular-ts
import { Component } from '@angular/core';
import { title } from '@signality/core';

@Component({
  template: `
    <header>
      <h1>{{ pageTitle() ?? 'My App' }}</h1>
    </header>
    <router-outlet />
  `,
})
export class App {
  readonly pageTitle = title(); 
}

Title from resolver ​

angular-ts
import { Component } from '@angular/core';
import { title } from '@signality/core';

// Route configuration:
// {
//   path: 'product/:id',
//   component: ProductPage,
//   title: route => `Product ${route.params['id']}`
// }

@Component({
  template: `
    <h1>{{ pageTitle() }}</h1>
  `,
})
export class ProductPage {
  readonly pageTitle = title(); // Will be "Product 123" for /product/123
}

Updating title ​

angular-ts
import { Component, effect, inject } from '@angular/core';
import { title } from '@signality/core';
import { MessagesStore } from './messages';

@Component({ /* ... */ })
export class MessagesPage {
  readonly pageTitle = title();
  readonly messages = inject(MessagesStore);

  constructor() {
    effect(() => {
      const count = this.messages.unreadCount();
      this.pageTitle.set(count > 0 ? `(${count}) Messages` : 'Messages'); 
    });
  }
}

SSR Compatibility ​

On the server, the signal initializes with the title from the snapshot.

Type Definitions ​

typescript
type TitleOptions = CreateSignalOptions<string> & WithInjector;

function title(options?: TitleOptions): WritableSignal<string>;
Edit this page on GitHub Last updated: Mar 19, 2026, 23:28:23