父组件的angular2调用函数


83

我有一个应用程序,其中有一个上传组件,可以在其中上传文件。它嵌入在中body.component

上传时,它应使用BodyComponent.thefunction()父组件的函数(例如)(进行调用以更新数据):但仅当父组件特别是时body.component。上载也可能以其他方式用于其他行为。

诸如此类parent(this).thefunction(),该怎么做?

Answers:


145

我将在子组件中创建一个自定义事件。像这样:

@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) {
  }
}

另一种方法是将父组件注入子组件中,但是它们将牢固地链接在一起...


知道为什么我有一个输出未定义的错误吗?它是通过从中导入在顶部的打字稿中定义的angular2/core。控制台日志显示angular2-
polyfills

哦,我的答案有错别字:@Ouput而不是@Output。可能是问题...我更新了答案。
Thierry Templier,2016年

嘿,没注意到。就是这样
PascalVKooten '16

现在得到一个uploadComplete is not defined注释,我只是复制了这些作为示例。父级也具有“ someMethod”,但是它已经存在问题uploadComplete。父组件确实在子节点上使用了(上载的)绑定,并且已经将子组件作为指令。
PascalVKooten '16

3
@Component中的指令和管道已从角度RC6弃用。
alex351

47

以下是最近为我工作的

角度5

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

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

ParentTemplate的模板中

<child-component (myEvent)="anyParentMehtod($event)"

3
这是一个很好的解决方案,因为它很简单,并且由父级决定要调用的方法。我喜欢:-)
杰特

1
如果我使用路由器插座怎么办?我还能使用(myEvent)吗?
罗伯·威廉姆斯

它用于父组件内部的子组件。不确定关于路由器插座。可能这个问题可以帮助您。stackoverflow.com/questions/45949476/...
Shabbir Dhangot

30

不涉及事件的解决方案。

假设我有一个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版。我需要使用5版本的Ionic 3。
Vasilis Greece

@VasilisGreece我不确定如何帮助您,但是我强烈建议您更新到最新的Ionic版本(当前为4)
Francesco Borzi

23

您可以将父组件注入子组件。

有关更多详细信息,请参见
-如何将父组件注入子组件?
--角2子组件是指父组件 这种方式可以确保thefunction()当父是只叫body.component

constructor(@Host() bodyComp: BodyComponent) {

否则@Output(),首选使用子级与父级进行通信。


1
顺便说一句,我不得不做constructor(@Host() bodyComp: BodyComponent)..也许是最近改变了。效果很好,谢谢!
Eddy Verbruggen

Thanjs了很多,我混的东西了-定
君特Zöchbauer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.