angular2 функция вызова родительского компонента

85

У меня есть приложение, в котором есть компонент загрузки, в котором я могу загрузить файл. Он встроен в body.component.

При загрузке он должен использовать функцию (например BodyComponent.thefunction()) родительского компонента (выполнить вызов для обновления данных): но только если это родительский компонент body.component. Загрузку также можно использовать в другом месте с другим поведением.

Что-то вроде parent(this).thefunction(), как это сделать?

ПаскальVKooten
источник

Ответы:

148

Я бы создал настраиваемое событие в дочернем компоненте. Что-то такое:

@Component({
  selector: 'child-comp',
  (...)
})
export class ChildComponent {
  @Output()
  uploaded = new EventEmitter<string>();

  uploadComplete() {
    this.uploaded.emit('complete');
  }

Ваш родительский компонент может зарегистрироваться на этом событии

@Component({
  template `
    <child-comp (uploaded)="someMethod($event)"></child-comp>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  (...)

  someMethod(event) {
  }
}

Другой способ - вставить родительский компонент в дочерний, но они будут прочно связаны друг с другом ...

Тьерри Темплиер
источник
Есть идеи, почему у меня ошибка вывода undefined? Он определен в машинописном тексте вверху путем импорта из angular2/core. Журнал консоли показывает проблему с angular2-polyfills
PascalVKooten
О, в моем ответе опечатка: @Ouputвместо @Output. Может быть проблема ... Я обновил свой ответ.
Тьерри Темплиер,
Хех, не заметил. Вот и все.
PascalVKooten
Теперь получаю uploadComplete is not definedзаметку, что я просто скопировал их в качестве примеров. У родителя тоже есть someMethod, но с ним уже есть проблема uploadComplete. Родительский компонент действительно использует (загруженную) привязку к дочернему узлу, и у него уже есть дочерний элемент в качестве директивы.
PascalVKooten
4
директивы и каналы внутри @Component устарели с angular RC6.
alex351
48

Ниже работает у меня в последнем

Угловой5

class ChildComponent {
  @Output() myEvent = new EventEmitter<string>();

  callParent() {
    this.myEvent.emit('eventDesc');
  }
}

В ParentTemplateшаблоне

<child-component (myEvent)="anyParentMehtod($event)"
Шабир Дхангот
источник
3
Это хорошее решение, потому что оно простое, и родитель решает, какой метод вызвать. Мне нравится :-)
Jette
1
Что делать, если я использую роутер-розетку? Могу ли я использовать (myEvent)?
Роберт Уильямс
Это дочерний компонент, используемый внутри родительского компонента. Насчет роутера-розетки не уверен. Может быть, этот вопрос вам поможет. stackoverflow.com/questions/45949476/…
Шабир Дангот
33

Решение без вовлеченных событий.

Предположим, что у меня есть ChildComponentи из него я хочу вызвать метод, myMethod()которому принадлежит ParentComponent(сохраняя исходный родительский контекст).

Класс родительского компонента:

@Component({ ... })
export class ParentComponent {

    get myMethodFunc() {
        return this.myMethod.bind(this);
    }

    myMethod() {
         ...
    }
}

Родительский шаблон:

<app-child [myMethod]="myMethodFunc"></app-child>

Дочерний шаблон

@Component({ ... })
export class ChildComponent {

    @Input() myMethod: Function;

    // here I can use this.myMethod() and it will call ParentComponent's myMethod()
}
Франческо Борци
источник
1
Я пробовал использовать это, но у меня это не работает. В моей версии myMethod он ссылается на набор вкладок родительского компонента (я пытаюсь переключить вкладки с дочернего элемента родительского компонента). Когда я ссылаюсь на это в родительском элементе, все работает. С ребенка попадает в myMethod, а вкладку не меняет. Поэтому мне интересно, является ли набор вкладок, на который он ссылается, копией реального, когда ребенок обращается к нему. Я не совсем уверен, что здесь происходит, когда this.myMethod.bind(this)его возвращают. (Возможно, вместо этого я делаю что-то в корне неправильно.)
Кэтрин Осборн
Знаю, но 8-й версией не пользуюсь. Мне это нужно для Ionic 3, который использует версию 5.
Василис Греция
@VasilisGreece Я не уверен, как вам помочь, но я настоятельно рекомендую вам обновить до последней версии Ionic (в настоящее время 4)
Francesco
Самый простой и самый прямой способ вызвать родительский метод, избегая ненужного импорта. Использование Angular 10 13 ноября 2020 г. Оценил.
CPHPython
23

Вы можете вставить родительский компонент в дочерний компонент.

Дополнительные сведения см. В разделе
- Как вставить родительский компонент в дочерний компонент?
- Дочерний компонент Angular 2 относится к родительскому компоненту. Таким образом, вы можете гарантировать, что он thefunction()будет вызываться только тогда, когда родителем является body.component.

constructor(@Host() bodyComp: BodyComponent) {

В противном случае использование @Output()предпочтительнее для общения от ребенка к родителю.

Гюнтер Цохбауэр
источник
1
Кстати, надо было сделать constructor(@Host() bodyComp: BodyComponent).. возможно, недавно его поменяли. Отлично работает, спасибо!
Эдди Вербрюгген
Спасибо, много, я что-то перепутал - исправлено
Гюнтер Цёхбауэр