首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解ngOnInit

了解ngOnInit
EN

Stack Overflow用户
提问于 2019-09-30 17:09:10
回答 3查看 158关注 0票数 2

我正在做一个关于angular的udemy课程,偶然发现了这段代码。我有一个示例项目,其中有一个添加项按钮,该按钮在数组中添加一个新项,并在屏幕上显示更新后的数组。

shopping-edit.component.ts

代码语言:javascript
复制
export class ShoppingEditComponent implements OnInit {

  @Input() ingredientsArray : Ingredient[];

  shoppingItemName : string = 'Test';
  shoppingItemAmount : number = 66;

  constructor(private shoppingListService : ShoppingListService) { }

  ngOnInit() {
  }

  onItemAdd(){
    console.log(this.shoppingItemName)
    this.shoppingListService.addIngredient(this.shoppingItemName, this.shoppingItemAmount);
  }

}

我有一个事件发射器,它在单击"add“按钮时发出更新后的数组。

shopping-list.service.ts

代码语言:javascript
复制
ingredientsChanged = new EventEmitter<Ingredient[]>();

addIngredient(name: string, value : number){
  this.ingredients.push(new Ingredient(name, value));
  this.ingredientsChanged.emit(this.ingredients.slice());
} 

为了显示这个列表,我使用了shopping list.Component.ts

代码语言:javascript
复制
export class ShoppingListComponent implements OnInit {

  constructor(private shoppingListService : ShoppingListService){}

  ingredients : Ingredient[];


  ngOnInit() {
    this.ingredients = this.shoppingListService.getIngredients();
    this.shoppingListService.ingredientsChanged.subscribe(
      (ingredients : Ingredient[]) => {
        this.ingredients = ingredients;
      }
    )
    console.log("hello")
  }

}

由于shopping List.Component.ts的ngOnInit()只运行一次,那么每次单击"add“按钮时,更新后的列表是如何显示的呢?

EN

回答 3

Stack Overflow用户

发布于 2019-09-30 17:31:27

您的列表未在ngOnOInit中更新。您仅在ngOnInit中订阅了一个可观察对象。因此,每当您在订阅中接收到新数据时,您就是在更新一个varible,然后由于该ngOnChanges被触发,这将更新您的视图。

票数 1
EN

Stack Overflow用户

发布于 2019-09-30 17:21:31

每次调用onItemAdd()时,您都在更新服务中的项目(使用下面这行代码:this.shoppingListService.addIngredient(this.shoppingItemName, this.shoppingItemAmount);)

并且将使用shoppingListService.ingredients (例如:- <div *ngFor="let ingredient of shoppingListService.ingredients > //here you will get individual ingredient </div> )显示

票数 0
EN

Stack Overflow用户

发布于 2019-09-30 17:22:10

这更多地与rxjs可观察对象的工作方式有关,而不是与ngOnInit有关。订阅监听事件,直到它被取消订阅。如果你只想让它接受第一个元素,你应该这样做:

代码语言:javascript
复制
this.shoppingListService.ingredientsChanged.pipe(take(1)).subscribe(
      (ingredients : Ingredient[]) => {
        this.ingredients = ingredients;
      }
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58164704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档