не получает значение от getRecipe ()

Я пытаюсь передать тему при получении данных из другой службы, но субъект не передает значение из setRecipe () в getRecipe (), а в ngOninit компонента нет значения, получаемого от службы.

 @Injectable()
export class RecipeService{
  recipesChanged = new Subject<Recipe[]>();
  private recipes:Recipe[]=[];
constructor(private slService:ShoppingListService){}
   setRecipes(recipe: Recipe[]){
      this.recipesChanged.next(this.recipes.slice());
     console.log("value from setRecipe()", this.recipes);
      }

   getRecipes(){
     console.log("value from getRecipes()", this.recipes.slice());
      return this.recipes.slice();
    
    }





  

в RecipeListComponent

   export class RecipeListComponent implements OnInit, OnDestroy {

   recipes:Recipe[];
   subscription: Subscription;
   constructor(private recipeService : RecipeService  , 
  private router : Router ,private route : ActivatedRoute 
   ) {}
    ngOnInit() {
    this.recipeService.recipesChanged
  .subscribe(
    (recipes: Recipe[]) => {
     console.log("recipes from recipe list comp",recipes);
      this.recipes = recipes;
     
    }
  );
 console.log("my recipes",this.recipes);
 this.recipes= this.recipeService.getRecipes();   

  }

и данные извлекаются из firebase в службе хранилища данных и устанавливаются в setRecipe () службы рецептов. Я получаю значение рецептов из Firebase в службу хранилища данных, а в журнале setRecipe () я получаю значение, но оно не устанавливает значение моих рецептов [] и поэтому не передает значение компоненту.


person Asha    schedule 06.08.2020    source источник


Ответы (1)


В вашем setRecipes значение, испускаемое вашим субъектом, является пустой переменной recipes массива, и ваш массив recipes никогда не изменяется.

Таким образом, getRecipes всегда будет возвращать пустой массив.

Также немного странно, если вы отправляете список рецептов с темой, зачем вам метод getRecipes? Вы должны просто выдать список рецептов, переданный в функцию setRecipes.

  setRecipes(recipe: Recipe[]){
      this.recipesChanged.next(recipe.slice());
  }

и в вашем компоненте

ngOnInit() {
    this.recipeService.recipesChanged
    .subscribe(
        (recipes: Recipe[]) => {
            this.recipes = recipes;     
        }
    );
}

Если вы хотите сохранить список рецептов в своем сервисе, вы можете сделать что-то вроде

@Injectable()
export class RecipeService{
recipesChanged = new BehaviourSubject(false);
private recipes:Recipe[]=[];

constructor(private slService:ShoppingListService){}

setRecipes(recipe: Recipe[]){
    this.recipes = recipe;
    this.recipesChanged.next(true);
}

getRecipes(){
    return this.recipes.slice();        
}

и в вашем компоненте

ngOnInit() {
    this.recipeService.recipesChanged
    .subscribe(
        hasChanged => {
            if (hasChanged)
            this.recipes = this.recipeService.getRecipes();     
        }
    );
}
person François Minh    schedule 06.08.2020
comment
setrecipe () вызывается из другой службы, в которую передается значение из БД. но субъект не передает это значение из setRecipe (). fetchRecipes () {return this.http.get ‹Recipe []› (// URL API ) .subscribe (recipes = ›{this.rService.setRecipe (recipes) // значение с массивом Recipes передается}); } - person Asha; 06.08.2020
comment
Я получаю значение внутри setRecipe (), когда регистрирую значение, но после сохранения его в recipes [] оно не попадает в getRecipe (). - person Asha; 06.08.2020
comment
В вашем коде массив рецептов инициализируется пустым, и вы никогда не помещаете в него какие-либо данные. Таким образом, getRecipe не может вернуть ничего, кроме этого пустого массива. - person François Minh; 06.08.2020