Как получить идентификатор с дочерним маршрутом в angular 8 - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть приложение angular 8.

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

У меня есть это как маршрутизация:

{
    path: ':dossierId',
    component: ViewComponent,
    resolve: {
      dossier: DossierResolver,
      dossierItems: DossierItemsResolver
    },
    children: [  

      {
        path: 'item/new/:dossierItemType',
        component: ItemComponent,
        resolve: {
          dossier: DossierResolver,
          dossierItems: DossierItemsResolver
        }
      },
    ]
  },


, и это компонент:

export class ItemComponent implements OnInit {
  itemTypes = DossierItemTypeDto;
  formBuilder = new FormBuilder();
  isNew = false;
  editItemForm: FormGroup;
  dossierItemId: string;
  item: DossierItemDto;
  dossierItems: DossierItemDto[];
  dossier: DossierDto;
  globalErrors: ValidationErrors;

  constructor(private dossierService: DossierService, private route: ActivatedRoute, private router: Router,
              private errorProcessor: ErrorProcessor) {

    this.route.params.subscribe((params: Params) => {
      this.dossier.id = params.id;
    });

    //this.dossier = this.route.snapshot.data.dossier;
    this.dossierItemId = this.route.snapshot.params.dossierItemId;
    this.isNew = this.dossierItemId === undefined;
    this.dossierItems = this.route.snapshot.data.dossierItems;

    if (this.isNew) {
      this.item =  {
        title: '',
        itemType: this.route.snapshot.params.dossierItemType,
        date: moment().format('Y-MM-DD'),
        createdAt: moment().format('Y-MM-DD'),
        body: '' };
    } else {
      this.item = this.dossierItems.find(i => i.id === this.dossierItemId);
    }
  }

  ngOnInit(): void {
    this.editItemForm = this.formBuilder.group({
      title: this.formBuilder.control(this.item.title, [Validators.required]),
      itemType: this.formBuilder.control(this.item.itemType, [Validators.required]),
      date: this.formBuilder.control(moment(this.item.date, 'Y-MM-DD'), [Validators.required]),
      body: this.formBuilder.control(this.item.body, [Validators.required, Validators.maxLength(2097152)])
    });
  }
}

Но каждый раз, когда это:

  this.dossier.id = params.id;

дает null

Так что я должен изменить по этому поводу?

Спасибо

, если я сделаю это:

 this.route.firstChild.params.subscribe((params: Params) => {
      this.dossier.id = params.id;
    });

Я уже получаю сообщение об ошибке при загрузке компонента:

core.js:6406 ERROR TypeError: Cannot read property 'params' of null
    at new ItemComponent (item.component.ts:36)
    at NodeInjectorFactory.ItemComponent_Factory [as factory] (item.component.ts:140)
    at getNodeInjectable (core.js:6176)
    at instantiateAllDirectives (core.js:14734)
    at createDirectivesInstances (core.js:14040)
    at ɵɵelementStart (core.js:23537)
    at Module.ɵɵelement (core.js:23597)
    at ViewComponent_div_1_Template (view.component.html:8)
    at executeTemplate (core.js:13997)
    at renderView (core.js:13797)

, если я делаю это так:

 {
    path: ':dossierId',
    component: ViewComponent,
    resolve: {
      dossier: DossierResolver,
      dossierItems: DossierItemsResolver
    }
  },

  {
    path: ':dossierId/item/new/:dossierItemType',
    component: ItemComponent,
    resolve: {
      dossier: DossierResolver,
      dossierItems: DossierItemsResolver
    }
  },

Тогда это работает.

Но я не хочу этого, потому что я хочу загрузить новый элемент в том же виде, а не в отдельном представлении

Thank you I try that: core.js:6406 ERROR TypeError: Cannot set property 'id' of undefined
    at SafeSubscriber._next (item.component.ts:37)
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
    at SafeSubscriber.next (Subscriber.js:122)
    at Subscriber._next (Subscriber.js:72)
    at Subscriber.next (Subscriber.js:49)
    at BehaviorSubject._subscribe (BehaviorSubject.js:14)
    at BehaviorSubject._trySubscribe (Observable.js:42)
    at BehaviorSubject._trySubscribe (Subject.js:81)
    at BehaviorSubject.subscribe (Observable.js:28)
    at new ItemComponent (item.component.ts:36)

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Если вы хотите получить dossierId , вы можете получить его, просто получив идентификатор. Поскольку id не существует в вашей конфигурации маршрутизации, вы не можете его получить. Получите dossierId следующим образом: -

this.route.params.subscribe((params: Params) => {
  this.dossier.id = params.dossierId;
});

И вы должны сделать это внутри метода ngOnInit().

0 голосов
/ 10 апреля 2020

Добавить firstChild после маршрута:

this.route.firstChild.params.subscribe((params: Params) => {
   this.dossier.id = params.id;
});
...