【问题标题】:Calling a function in a child Angular2 Component?在子 Angular2 组件中调用函数?
【发布时间】:2016-02-02 06:48:28
【问题描述】:

我有一个充当搜索栏的组件。它可以发出 api 请求并通过@OutputEventEmitter 将结果提供给应用程序的其余部分,但我也希望一个函数能够以另一种方式运行。搜索栏组件保留了它的搜索历史,我想为父组件提供一种清除历史的方法。我能想到的最好的办法就是以某种方式从父组件调用我的搜索栏中的方法。

我想出的最好方法(但无法正确实施)是尝试将EventEmitter 传递到我的搜索栏,然后孩子订阅父母的事件。 @Input 在构造函数时尚未完成绑定,因此实际执行此操作会很棘手。

我想我可以尝试将历史记录存储在父组件中,但是搜索栏是一个组件的原因是因为它会出现在多个地方,这不符合关注点分离,所以似乎最好保留搜索栏组件中的历史记录。

父组件如何调用子组件上的函数?

【问题讨论】:

  • 将搜索历史放在服务中,您的子组件可以绑定到服务'历史'实例变量。该服务可以清楚地表明父母可以调用。只是一个想法。还没试过。
  • 一本不错的读物 - learnangular2.com/viewChild

标签: angular


【解决方案1】:

事实证明,我可以在组件上放置一个局部变量并访问它的公共函数。即:

<search-bar #SearchBar ...></search-bar>
<button (click)='SearchBar.ClearHistory()' ...></button>

显然,局部变量绑定到组件,而不是像我最初认为的那样绑定到 DOM。我想我可以访问所有公共领域和功能。

【讨论】:

  • 这确实是有史以来最好的事情。不错。
  • 不仅如此,您还可以将 SearchBar 作为参数传递给函数调用,如果声明为“any”,则可以使用它,而无需使用丑陋杂乱笨拙的 ViewChild ;)
  • 你也可以在父组件中处理点击事件。如果你使用ViewChild('SearchBar') = SearchBar,你可以在ViewChild上使用this.SearchBar.ClearHistory(),来执行childs方法!
【解决方案2】:

您需要利用@ViewChild 装饰器通过注入从父组件引用子组件:

import { Component, ViewChild } from 'angular2/core';  

(...)

@Component({
  selector: 'my-app',
  template: `
    <h1>My First Angular 2 App</h1>
    <child></child>
    <button (click)="submit()">Submit</button>
  `,
  directives:[App]
})
export class AppComponent { 
  @ViewChild(SearchBar) searchBar:SearchBar;

  (...)

  someOtherMethod() {
    this.searchBar.someMethod();
  }
}

这是更新的 plunkr:http://plnkr.co/edit/mrVK2j3hJQ04n8vlXLXt?p=preview

您可以注意到@Query 参数装饰器也可以使用:

export class AppComponent { 
  constructor(@Query(SearchBar) children:QueryList<SearchBar>) {
    this.childcmp = children.first();
  }

  (...)
}

希望对你有帮助 蒂埃里

【讨论】:

  • 我喜欢这种方法。它对我的解决方案的额外好处是,在我的解决方案中,我无法访问父组件代码文件中的 SearchBar,我只能在我的模板代码中访问它(这会很快变得混乱)。
  • 这很棒,因为我想根据引发的不同子组件事件自动调用该方法,因此模板方式不适合我。但是,如果我在此页面上有 2 个 SearchBar 组件,是否可以指定调用哪个组件的 someMethod?
  • @James 结果是出现在 html 中的第一个匹配的孩子获得了调用。如果有多个相同的组件,我想我们可以使用 Thierry 解决方案的第二个选项。不知道这是否是要走的路
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2016-12-13
  • 2017-01-09
  • 1970-01-01
  • 2016-10-06
  • 2019-01-17
相关资源
最近更新 更多