5

我有一个服务,我声明我的变量。在我的组件中,我使用此变量将数据放入其中。

服务:

@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;

    }    
}    

我只发布了必要的代码this.dataService.msgs。充满消息的 het 工作正常。当我到达另一个组件时,this.dataService.msgs 的数据仍然存在,但是当我返回时Messagescomponentthis.dataService.msgs直到undefined我再次填充它,但我需要其中的数据。有人知道该怎么做吗?

谢谢

4

2 回答 2

10

如果您在注释DataService的提供者数组中提供您的内部,@Component

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

此服务将是此组件的单例(它将创建一个新实例)(如果他们还没有在其注释下提供此服务,则它是子组件)。

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

@NgModule({
    providers:[DataService]
})

来源:https ://angular.io/guide/dependency-injection#injector-hierarchy-and-service-instances

角 9 更新

全局级服务现在定义为

@Injectable({
  providedIn: 'root',
})
export class DataService {

这应该是推荐的方法,因为如果未使用它,它会自行摇树。

来源:https ://angular.io/guide/providers#providedin-and-ngmodules

于 2017-05-16T09:35:19.533 回答
3

只是对 echonax 的答复的快速阐述,是提供者作为一个层次结构工作。如果将其添加到 app-module,它将在整个应用程序中运行,因此您不应在其他任何地方“提供”它。但是,如果不需要“全局”服务,只需在父组件上提供它。

于 2017-06-02T12:50:34.777 回答