Angular 2-Typescript Basic Test-Класс Базы Данных


Я изучаю Angular 2 и играю с проектом песочницы, и мне было интересно, как использовать класс в другом классе, похожем на то, что вы сделали бы в Java или других языках ООП.

Если у меня есть класс MockDatabase, например:

export class MockDatabase {


constructor(private list: Restaurant[]){
    this.list.push({ id: 1, name: "Chinese", tags: ["Chinese"] });
    this.list.push({ id: 2, name: "Mexican", tags: ["Mexican"] });
    this.list.push({ id: 3, name: "Italian", tags: ["Italian"] });
    this.list.push({ id: 4, name: "American", tags: ["American"] });

}

getList(): Restaurant[] {
    return this.list;
}
}

И я хочу использовать этот класс в классе обслуживания так:

@Injectable()
export class RestaurantsService {


constructor(private db: MockDatabase){

}

getAllRestaurants(): Restaurant[] {
    return this.db.getList();
}


}

Который затем используется в этом компоненте:

@Component({
  selector: 'restaurants',
  templateUrl: 'restaurants.html',
  providers: [RestaurantsService, PreferencesFilterService]
})
export class RestaurantsComponent implements OnInit{

restaurants: Restaurant[];

constructor(
  private restaurantsService: RestaurantsService,
  private preferencesFilterService: PreferencesFilterService
) {}

ngOnInit(): void {
  this.restaurants = this.restaurantsService.getAllRestaurants();
}

filterRestaurants(): void {
  this.restaurants = this.preferencesFilterService.getFilteredRestaurants();
}

Я получаю сообщение об ошибке "нет поставщика для MockDatabase", но затем, если я добавлю его в качестве поставщика к RestaurantsComponent я получаю еще одну ошибку, говоря " нет поставщика для Array ()", поэтому я думаю, что делаю что-то неправильно здесь.

Я полагаю, что у меня может быть фундаментальное непонимание того, как вы должны проектировать подобные вещи в Angular 2, поскольку я совершенно новичок в веб-разработке в целом. Любая помощь или указания в правильном направлении были бы очень признательны, так как у меня возникли проблемы с поиском хорошего ресурса в интернете. Большое спасибо, что уделили мне время.
1 3

1 ответ:

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

export class MockDatabase {
private list: Restaurant[]

constructor(){
    this.list = new Array();
    this.list.push({ id: 1, name: "Chinese", tags: ["Chinese"] });
    this.list.push({ id: 2, name: "Mexican", tags: ["Mexican"] });
    this.list.push({ id: 3, name: "Italian", tags: ["Italian"] });
    this.list.push({ id: 4, name: "American", tags: ["American"] });

}

getList(): Restaurant[] {
    return this.list;
}
}

И

@Injectable()
export class RestaurantsService {
private db: MockDatabase;

constructor(){
    this.db = new MockDatabase();
}

getAllRestaurants(): Restaurant[] {
    return this.db.getList();
}


}

Класс RestaurantsComponent все тот же.