Как реализовать вложенную вторичную маршрутизацию и при этом получить данные от дочерних?Угловой 6 - PullRequest
0 голосов
/ 29 мая 2018

Моя цель - отправить данные от маршрутизируемого потомка родителю.Я хочу получить ссылку на переменную от дочернего элемента, который вложен в дочерний элемент для родительского элемента через вторичные маршруты, чтобы переменная синхронизировалась с родительским элементом.Эта переменная в конечном итоге будет логическим значением состояния проверки формы.К сожалению, когда я использую Behavior Subject, я думаю, что должен использовать селектор компонентов, который, кажется, не очень хорошо работает с маршрутами в моем приложении.

Это пример из шаблона приложения ... Кажется,когда я добавляю селектор компонента app-new-user, он запутывает выход нового маршрутизатора с именем newuserinput: (

<!-- To BLADE LAYER 3 -->
<router-outlet></router-outlet>
<!-- <router-outlet name="newuserinput" (newUserInfoCompleteEvent)="receiveNewUserInfoComplete($event)"></router-outlet> -->
<router-outlet (activate)='getVState($event); ' name="newuserinput"></router-outlet>
<router-outlet name="newuserorginfo"></router-outlet>
<router-outlet name="newusersupervisorinfo"></router-outlet>
<router-outlet name="newusersecurityinfo"></router-outlet>
<!-- end -->



<!-- For ViewChild: bringing form validity state from child -->
<!-- <app-new-user-input style="display:none;"></app-new-user-input> -->
<!-- can't do this because putting the child component selector in the parent disables the childs router outlet -->

В моем прототипе stackblitz , который я подготовил, дочерняя / родительская структурауспешно работает со службой для отображения нужной информации, однако, как только я заменяю селекторы компонентов в родительском (app-компонент) именованными маршрутами (как в приведенном выше фрагменте моего приложения), это ломается.цель этого прототипа - отобразить «Привет из вторичного дочернего элемента» на родительском элементе, при этом параметры вторичного маршрута маршрутизации будут правильно отображаться в адресной строке следующим образом: https://behavior -subject-0007.stackblitz.io / (child:ребенок / (вторичный ребенок: вторичный ребенок))

Мой вопрос: Итак, как я могуреализовать вложенную вторичную маршрутизацию и по-прежнему получать данные по ссылке от дочернего элемента к родительскому, чтобы адресная строка отображалась следующим образом https://behavior -subject-0007.stackblitz.io / (child: child / (virtualchild: secondchild)) ?

Могу ли я использовать тему поведения для этого или есть лучший способ?Я думал о попытке реализовать решение AJ2_82 .

Я также изучал простое связывание свойств маршрутизируемого дочернего компонента с использованием метаданных хоста компонентов ...

Я относительно новичок в программировании, поэтому может быть «очевидное» решение, спасибо за любую помощь, которую вы можете предоставить.

Если вы поделитесь ВАШИМ способом, который будет соответствовать тем же требованиям (названный адрес выхода маршрутизатора и данныессылка от ребенка к родителю) Я все уши.Спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Одним из многих способов решения этой проблемы является использование событий , загрузка источника событий в вашу общую службу public onChange: EventEmitter<string> = new EventEmitter<string>();, а затем передача его от родителя его дочерним элементам или наоборот, как это

changeMessage(message: string) {
    this.currentMessage = of(message)
    this.onChange.emit(message); 
  }

В каждом случае, когда вы хотите, чтобы требуемый компонент присоединился к коммуникативному кусту, добавьте перехватчик событий из этого сервиса: this.myService.onChange.subscribe(message=> this.message = message);

Таким образом, вы можете реализовать «внешний», но полныйфункциональный подход для обмена данными в режиме реального времени между маршрутами.

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


Или вы можете использовать уникальные параметры маршрута

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

Вы бы сконфигурировали модуль следующим образом:

export const routes: Routes = [
  { path: '', redirectTo: 'component-one/:message', pathMatch: 'full' },
  { path: 'component-one/:message', component: ComponentOne },
  { path: 'component-two/:message', component: ComponentTwo,
    children: [
      { path: '', redirectTo: 'child-one', pathMatch: 'full' },
      { path: 'child-one/:message', component: ChildOne },
      { path: 'child-two/:message', component: ChildTwo }
    ]
  }
];

Так, чтобы каждый вызов одной из этих филиалов сопровождал некоторый параметр, который будет использоваться в html-ядре компонента.

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

newMessage(param?) {

    if(typeof(param) === 'undefined')
       this.message = "Parent";
    else
       this.message = param;

    var actualroute=this.router.routerState.snapshot._root.children[0].children[0].value.url[0].path;
    this.router.navigate(['/component-two', this.message , actualroute, this.message  ],{relativeTo: this.route});   
}

Вы можете видеть, как все это работает здесь .Спасибо за эту забавную задачу.

Слабое место : при каждом обновлении переменной message маршрутизатор снова и снова переходит к той же иерархии, которая особенно затратна для времениреализации большего размера.

Сильная сторона : когда вы вызываете router.navigate, существует возможность передавать пользовательские данные между компонентами, например, «mesage1» для дочернего элемента и «message2» для родительского элемента водин ряд: this.router.navigate(['/component-two', 'message2' , 'child-one', 'message1']);.Это можно сделать, но очень сложно и запутанно, используя услугу.

...