NgModules:使用另一个组件的方法

时间:2016-09-04 07:10:32

标签: angular typescript

我有两个模块,一个是根模块,另一个是共享模块。这是共享模块:

import { NgModule } from '@angular/core';
import { SomeComponent } from "./somecomponent";
@NgModule({
    declarations: [SomeComponent],
    exports: [SomeComponent]
})
export class SomeModule {}

我在Root模块中导入SomeModule,如下所示:

import { NgModule }       from '@angular/core';
import { BrowserModule  } from '@angular/platform-browser';
import { AppComponent }   from './app.component';
import { SomeModule } from somemodule/somemodule';

@NgModule({
    declarations: [AppComponent],
    imports:      [BrowserModule, SomeModule],
    bootstrap:    [AppComponent], 
})
export class AppModule {}

直到那时它才能正常工作。现在,我想在我的SomeComponent中使用属于app.component一部分的方法。但问题是共享模块没有直接公开SomeComponent

我如何调用SomeComponent课程中AppComponent的任何方法?如果方法为static,会发生什么变化?

编辑:也许我以前不清楚。但SomeComponent是一个指令我在AppComponent的模板中使用没有问题,但它也有一个静态方法,我需要在AppComponent的类中调用,因为我正在导入它在Root模块中,应该可以在AppComponent中使用。我在AppComponent

中想要这样的东西
import {Component} from '@angular/core';
@Component({
    selector: 'my-app',
    template: `<some-component (someEvent)="handle($event)"></some-component>`
})
export class AppComponent {

  _constructor(){}

  handle(event){

   SomeComponent.someStaticMethod();

  }
}

1 个答案:

答案 0 :(得分:1)

编辑:好的,对于你想要达到的目标,angular2提供了他们所谓的ViewChild。

import { Component, ViewChild } from '@angular/core';
import { SomeComponent } from './some.component';

@Component({
    selector: 'my-app',
    template: `<some-component (someEvent)="handle($event)"></some-component>`
})
export class AppComponent {
    @ViewChild(SomeComponent) private someComponent:SomeComponent;

    constructor () {}

    handle(event) {

        this.someComponent.someStaticMethod();
    }
}

我还添加了一个Plunk:https://plnkr.co/edit/8aGi4GNWUAKdf01ZPplB?p=preview

初步回复

我不确定你是否确实引用了组件,或者你的组件是指一般的类。

在第一种情况下,关于Angular2中的父组件和子组件交互(无论组件属于哪个模块......),调用子组件方法的方法是使用 #spy

<parent-component>
    <child-component #child></child-component>        
    <button (click)="child.someMethod()">Call method of child</button>
</parent-component>

在第二种情况下,您希望其他类(例如,组件访问的服务)访问类的公共方法(无论此类属于哪个模块),您需要以某种方式创建或传递这个类的一个实例(例如服务)到这些其他类(例如组件)。在angular中实现此目的的一种方法是使用@Injectable()装饰器,并将此类(服务)传递给需要访问该服务的每个组件的构造函数。否则,只需创建一个新的类实例(let a = new MyClass();)并直接调用其公共方法(a.somePublicMethod();)。

PS。另请注意,除了类,组件,服务等,在ES6中,您还可以导出普通函数

export function myFunction(a: any, b: any) {
  // ...
}