Новый экземпляр одноэлементного сервиса Angular создается в другом одноэлементном сервисе - PullRequest
0 голосов
/ 29 января 2019

Я новичок в Angular и пытаюсь выяснить, как внедрить мой Angular-сервис (игровой сервис) в другой Angular-сервис, который будет Resolver (игровой преобразователь).В моем приложении обычно создается только один экземпляр моего игрового сервиса, и я успешно внедряю его в каждый из моих компонентов, но когда требуется мой сервис разрешения игр, он создает новый экземпляр игрового сервиса, даже если игровой сервисдолжен быть одиноким.

Я попытался объявить обе службы в массиве «провайдеров» моего NgModule, чтобы попытаться сделать их обеими одноэлементными службами, и я также попытался объявить «обеспеченный в:« корень »в@Injectable декоратор, но новый экземпляр игрового сервиса создается при вызове конструктора сервиса решателя игр.

//GameResolver.service.ts

    @Injectable({
      providedIn: 'root'
    })
    export class GameResolverService implements Resolve<Game> {
      constructor(private gameService: GameService) {

      }


      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Game> {

          return this.gameService.getGameById(gameId)

      }
    }

//game-resolver.service.spec.ts    

import { TestBed, inject } from '@angular/core/testing';

import { GameResolverService } from './game-resolver.service';

describe('GameResolverService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [GameResolverService]
    });
  });

  it('should be created', inject([GameResolverService], (service: GameResolverService) => {
    expect(service).toBeTruthy();
  }));
});



//Game.service.ts

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Game } from './game';
import { map } from "rxjs/operators";
import { User } from './user';


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

  constructor(private http: Http) {
    console.log('new instance of GameService created');
  }



//app.module.ts

const appRoutes: Routes = [
  ...
  {path:'game', component: GameComponent, data:{depth:3}, resolve: { game: GameResolverService}},
  {path:'endGame', component: EndGameComponent, data:{depth:4}},
  {path:'nextRound', component: NextRoundComponent, data:{depth:5}}
]

@NgModule({
  declarations: [
    ...
  ],
  imports: [
    ...
  ],
  bootstrap: [AppComponent],
  providers: [GameService, GameResolverService]
})


//create-game.component.ts
...
import {GameService} from '../game.service';




@Component({
  selector: 'app-create-game',
  templateUrl: './create-game.component.html',
  styleUrls: ['./create-game.component.css'],

})
export class CreateGameComponent implements OnInit {
  // @HostListener('window:popstate', ['$event'])




  constructor(private gameService: GameService, private router: Router) {
   }


//game.component.ts

@Component({
  selector: 'app-game',
  templateUrl: './game.component.html',
  styleUrls: ['./game.component.css']
})
export class GameComponent implements OnInit {

  game:Game;

  constructor(private gameService: GameService, private router: Router, private socketService: SocketService, private route: ActivatedRoute ) {
    this.game = this.route.snapshot.data['game']
  }
}

Есть что-то, чего я не понимаю в иерархии внедрения угловой зависимости?Мне нужно, чтобы GameService был одноэлементным сервисом во всех частях приложения, поэтому мне нужно внедрить одноэлементный экземпляр в сервис Game Resolver без создания нового экземпляра.

1 Ответ

0 голосов
/ 02 февраля 2019

После долгих поисков я наконец понял, что в моем файле app.component.ts у меня все еще есть массив providers, определенный в декораторе @Component, в то время как я использовал метод providedIn: 'root'.Джават Ушев был прав, вы не можете использовать оба из них одновременно.Я думал, что избавился от всех моих providers деклараций, но я понятия не имел, что один был там.Теперь работает отлично.Спасибо за помощь, ребята.

...