Angular 2 仅在应用程序初始化时调用服务



我要完成的是每次应用程序初始化仅调用一次外部API。

我有一个简单的服务,

@Injectable()
export class XService {
    url = "http://api.example.com"
    constructor(private _http:Http) {
    }
    callAnAPI(){
        console.log('made an external request");
        return this._http.get(url)
            .map(res=>res.json());
    }
}

和两个组件,主要appComponent

@Component({
  selector: 'my-app',
  template: `
    <div>
      Test
    </div>
  `
})
export class AppComponent {
    isLoading = true;
    results = [];
    constructor(private _service: XService){
    }
    ngOnInit(){
        Observable.forkJoin(
            this._service.callAnAPI()
            // some more services here
        )
        .subscribe(
            res => {
                this.results = res[0];
            },
            null,
            () => {this.isLoading = false}
        );
    }
}

以及与路由一起使用的另一个组件

@Component({
  template: `
    <div>
      I want to use the service with this component.
    </div>
  `
})
export class SecondComponent {
    constructor(private _service: XService){
    }
}

服务初始化,Angular 在AppComponent初始化时命中服务器。 我也想将XServiceSecondComponent一起使用,每当我尝试从SecondComponent再次调用服务时,(通过_service._service.callAnAPI())Angular 都会命中外部 API。我想尽量减少外部命中。

如何获取初始化时AppComponent创建的数据,而不是在SecondComponent中再次调用服务

您可以使用 do 运算符在第一次获取数据并在下一次调用中重复使用它们:

@Injectable()
export class XService {
  url = "http://api.example.com"
  constructor(private _http:Http) {
  }
  callAnAPI(){
    console.log('made an external request");
    if (this.cachedData) {
      return Observable.of(this.cachedData);
    } else {
      return this._http.get(url)
        .map(res=>res.json())
        .do((data) => {
          this.cachedData = data;
        });
    }
  }
}

如果要在启动时加载数据,可以从服务构造函数调用 callAnAPI 方法。

为了能够使用此方法,您需要在引导应用程序时定义服务:

bootstrap(AppComponent, [ XService ]);

这样,您将对整个应用程序使用单个实例。

@Injectable()
export class XService {
    url = "http://api.example.com"
    constructor(private _http:Http) {
    }
    callAnAPI(){
      if(this.data) {
        return Observable.of(this.data);
      } else {
        console.log('made an external request");
        return this._http.get(url)
            .map(res=>res.json())
            .do(res => this.data = res);
      }
    }
}

相关内容

  • 没有找到相关文章

最新更新