2017-05-16 61 views
1

我有一个服务,我声明我的变量。 在我的组件中,我使用这个变量来将数据放入它。组件之间的角度 - 共享服务不起作用

服务:

@Injectable() 
export class DataService { 

    public msgs = []; 

    constructor() { }  

} 

现在我用这个变量在我的组件:

export class MessagesComponent implements OnInit { 

    constructor(private dataService: DataService){} 

    ngOnInit() { 
     this.getData(); 
    } 

    getData(){ 
     let msgs = []; 

     if (diffr <= this.geomessage[i].range) { 
      this.geomessage[i].dist = diffr; 
      msgs.push(this.geomessage[i]); 
      //console.log("this message: ", this.geomessage[i]); //DEBUG 
     } 
     this.dataService.msgs = msgs; 

    }  
}  

我只贴了必要的code.The this.dataService.msgs HET充满信息能正常工作。当我到另一个组件时,this.dataService.msgs的数据仍然存在,但是当我回到Messagescomponentthis.dataService.msgsundefined直到我再次填充它,但我需要其中的数据。有人知道如何做到这一点?

THX

回答

5

如果您提供您的DataService@Component注释的供应商阵列内,

@Component({ 
    ... 
    providers: [DataService], 
})... 

这项服务将是一个单身(它会创建一个新的实例),该组件(和如果他们还没有在他们的注释下提供这项服务,那么他们就是孩子)。

如果您想在多个组件之间使用此服务并共享相同的服务实例,您需要在DI树中这些组件的父级组件中提供此服务。如果这是全球服务,我建议在您的AppModule中(或在共享模块中)提供只有

@NgModule({ 
    providers:[DataService] 
}) 
+0

没有添加在NgModule我会尝试 – user3356007

+0

@ user3356007也从'@ Component'注释中移除它 – echonax

+0

如何在组件中使用它如果我不把它放在组件的提供程序构造函数中? – user3356007

1

只是快速阐述echonax的回复,是提供者作为一个层次结构工作。如果您将其添加到应用程序模块,它将在整个应用程序中运行,因此您不应该在其他地方“提供”它。 但是,如果不需要“全局”服务,只需将其提供给父组件即可。