Используйте переменную `title` из определенного места в гораздо более высокий шаблон - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть шаблон, который хорошо работает (пока) для моего приложения.Есть боковая панель, верхний и нижний колонтитулы, каждый из которых находится в своем собственном компоненте, и все строительные блоки на месте.

Проблема в том, что я хочу использовать определенную информацию, относящуюся к используемому представлению- Например, в модуле запросов есть новый компонент запроса, и я хочу показать «Новый запрос» в качестве заголовка в компоненте заголовка.

Я начал использовать службу, но не уверен, как обновитьэто, учитывая, что я пытался это сделать, но имел ошибку при использовании ngOnInit (который вызывается один раз, поэтому в заголовке нет обновления / отслеживания).

Я попытался передать произвольные данные вмаршруты, с переменной data.Проблема, которую я обнаружил, состоит в том, что наблюдаемая ActivatedRoute data дает данные для родителя, а не для потомков.Я мог бы использовать firstChild, но тогда заголовок не обновляется при изменении маршрута.

Я изучал документацию по использованию подхода Input, но поскольку шаблоны используют router-outlet, он не 'Кажется, что он работает (я не смог настроить Angular таким образом, и все же я не знаю, как правильно его обновить).

Есть ли правильный способ сделать это?У меня есть разумный подход?Может быть, я фокусируюсь с плохой точки зрения, но я не вижу, как это сделать простым способом.


Я чувствовал, что размещение кода может привести к путанице, но, возможно, это дает некоторые идеина то, что я хочу / что я пытался.Возможно, следующий код - полная фигня, и я ошибся.Может быть, это можно спасти.Обратите внимание, что использование службы или использование данных маршрута - это разные (исключительные?) Подходы, и я застрял с обоими.

// header.component.ts

@Component({
(...)
export class HeaderComponent implements OnInit {
  ngOnInit() {
    // Conceptually, using Tried using a service here
    this.title = this.extraRouteInfoService.getTitle();
    // alternatively, something along
    this.title = this.route.data.pipe(map(data => data.title));
    // or with some conceptual method that doesn't exist
    this.title = this.route.getDataForLastChildCurrentRoute(magic);
  }
}
<!-- header.component.html -->
<div>
...
<h1>{{ title | async }}</h1>
...
</div>
<!-- home.component.html -->
<div>
<app-layout-header></app-layout-header>
  <main class="content">
    <router-outlet></router-outlet>
  </main>
</div>
// home-routing.module.ts
const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    canActivate: [AuthGuard],
    data: {
      title: 'Home',
    },
    children: [
      {
        path: 'enquiries',
        loadChildren: '../enquiries/enquiries.module#EnquiriesModule'
      }
    ]
  }
];
//(...)
// enquiries-routing.module.ts

const routes: Routes = [
  {
    path: '',
    component: EnquiryListComponent,
    data: {
      title: 'All enquiries'
    }
  },
  {
    path: 'new',
    component: EnquiryNewComponent,
    data: {
      title: 'New enquiry'
    }
  }
];
//(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...