2017-08-31 105 views
1

我正在尝试学习Angular,并遇到了可能是一个非常简单的问题。为什么我的Angular2控件需要作为提供者包含在内?

我写了一个名为“PageSelectorComponent”的网格分页的子组件。该组件只需要一个总记录数并计算并显示页面链接(该组件中不使用提供程序)。我将这个组件嵌入到另一个名为“TestComponent”的组件中。

PageSelectorComponent和Test Component包含在我的app.module.ts文件的delarations部分。

我的问题是,我得到以下错误:

ERROR Error: Uncaught (in promise): Error: No provider for PageSelectorComponent! 

如果我添加PageSelectorComponent到app.module.ts一切工作正常的供应商部分除了现在我得到的分量两个实例 。这导致我的订阅不起作用。

我已经查看了如何声明PageSelectorComponent和TestComponent,但没有看到区别。

为什么该应用程序抱怨没有将PageSelectorComponent列为提供程序?

这里是我的app.modules.ts的NgMoudle部分:

@NgModule({ 
    declarations: [ 
    AppComponent, 
    NavigationComponent, 
    HomeComponent, 
    PageSelectorComponent, 
    TestComponent, 
    ], 
    imports: [ 
    BrowserModule, 
    RoutingModule, 
    ], 
    providers: [ 
    PageSelectorComponent // App complains if I leave this out but now I get 2 instances of the component. 
    ], 
    bootstrap: [AppComponent] 
}) 

这里是PageSelectorComponent定义:

@Component({ 
    moduleId: module.id, 
    selector: 'app-page-selector', 
    templateUrl: './page-selector.component.html', 
    styleUrls: ['./page-selector.component.css'], 
}) 

export class PageSelectorComponent { 
    // member variables declared here 
    . 
    . 
    private static instanceNum: number = 0; // TOOD: debugging 

    constructor() { 
    PageSelectorComponent.instanceNum += 1; 
    console.log(`page-selector instance number ${PageSelectorComponent.instanceNum}`) 
    this.subject = new Subject(); 
    } 

就像我说的,我觉得有一些非常基本的我错过了这里的角度。任何建议在哪里看?

在此先感谢!

+0

你不需要把它提供给'providers','PageSelectorComponent.instanceNum + = 1;'这里的东西导致麻烦'this.instanceNum?'如果在其他组件中有'PageSelectorComponent.instanceNum + = 1;'这样的东西最好不要这样做 – masterpreenz

+0

感谢您的快速回复。我知道我不应该在提供者部分列出PageSelectorComponent。只是试图再次拿出它,但我得到了与上述相同的错误。还拿出'static instanceNum'。我仍然得到两个实例。我的想法是,这是因为它在声明**和**提供程序中列出。 –

+0

如果'没有PageSelectorComponent'的提供者出现意味着'PageSelectorComponent'被使用像一个服务/提供者会在其他组件中的某处 – masterpreenz

回答

0

非常感谢masterpreenz设置我直接在此。

我会回答这个问题来关闭线程,现在我已经了解了Angular。由于我是新手,请告诉我是否仍然有问题!

正如所料,这是对主题/观察者模式的基本误解。事实证明,我试图从component1中创建一个新的Subject,为此我将另一个组件2观察并对点击作出反应。为了访问component1的主题,需要在构造函数中实例化component2。

constructor(private pager: coomponent1) {} 

这把COMPONENT1像一个服务(因为它被注入),这就是为什么我需要把它列入两个app.module的声明和供应商的部分。

要做到这一点(我肯定不是唯一的方法)的方法是创建一个处理逻辑的服务。然后component1可以在被点击时调用服务。 component2然后可以订阅该服务。

实际上,这允许component2对来自component1的点击做出反应。

相关问题