Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在多个组件之间共享来自单个实例服务的数据(和缓存的数据)_Angular_Typescript - Fatal编程技术网

Angular 在多个组件之间共享来自单个实例服务的数据(和缓存的数据)

Angular 在多个组件之间共享来自单个实例服务的数据(和缓存的数据),angular,typescript,Angular,Typescript,我正在创建一个服务,该服务将从服务器中提取数据,然后将该数据加载到一个属性中以供以后使用,然后通知所有组件该服务已就绪。将数据加载到属性中的想法是,组件可以通过某些方法同步查询数据 我遇到的问题是,每个组件都会触发一个新的http调用 所以问题是,我如何只发出一个http请求,然后在数据准备就绪时通知所有组件 @Injectable({ providedIn: 'root' }) export class TypelistService { private readonly ba

我正在创建一个服务,该服务将从服务器中提取数据,然后将该数据加载到一个属性中以供以后使用,然后通知所有组件该服务已就绪。将数据加载到属性中的想法是,组件可以通过某些方法同步查询数据 我遇到的问题是,每个组件都会触发一个新的http调用

所以问题是,我如何只发出一个http请求,然后在数据准备就绪时通知所有组件

@Injectable({
    providedIn: 'root'
})
export class TypelistService {
    private readonly baseURL = `${environment.myEndpoint}/api/typelist`;
    private list: Type[];
    private iSeeYou: Observable<ServiceStatus>;
    constructor(private http: HttpClient) {
        console.log('Hello Constructor'); // <-- this line execute only once as expected
        this.iSeeYou = new Observable((observer) => {
            observer.next({ status: 'calling' });
            this.http.get(this.baseURL).subscribe((data: Type[]) => {
                this.list = data;
                observer.next({ status: 'ready' });
                observer.complete();
            });
        });
    }

    init(): Observable<ServiceStatus> {
        return this.iSeeYou;
    }
    getAllTypes() {
        return this.list;
    }
    getItemById(id: number): Type {
        let item: TypeError;
        this.list.forEach((i) => {
            if (i.id === id) {
                item = i;
            }
        });
        return item;
    }
    getItemByName(name: string): Type {
        let item: TypeError;
        this.list.forEach((i) => {
            if (i.name === name) {
                item = i;
            }
        });
        return item;
    }
}

如果您想让其他组件知道数据是否可用并准备就绪。您可以在服务中将列表声明为行为主体。这样,每当列表中有更改或更新时,每个订户都会收到通知并收到可用的最新值

例:

您可以将列表公开为其他人可以观察到的,以便其他组件不会与主题值混淆:

list = this.listData.asObservable();
现在,您可以订阅components中的列表,并在列表更改时立即获得更新。所有订阅服务器都将具有列表中的最新值

阅读更多关于

iSeeYou() {
//make service call get the data and push to list
        this.listData.next(data);
    }
list = this.listData.asObservable();