網站搜尋

angular - 將函數傳遞給子元件時,'this' 的上下文錯誤


我正在嘗試將一個函數傳給子組件。傳遞函數本身沒有問題。問題是,如果我想更改父組件的屬性值,這將無法運作,因為 'this' 並不是指向父組件,而是指向子組件(在我的情況下是 DatagridComponent)

this 的上下文似乎是問題所在。請參見下面程式碼中的註解。

父元件:

@Component({
  selector: 'app-user-management',
  templateUrl: './user-management.component.html',
  styleUrls: ['./user-management.component.css'],
})
export class UserManagementComponent implements OnInit {
  showUserDetails: boolean: false;
  showUsergroupDetails = false;

  onSelectUser() {
    this.showUsergroupDetails = false;
    this.showUserDetails = true;
    console.log(this.showUsergroupDetails); // prints false, as expected
    console.log(this.showUserDetails); // prints true, as expected
    console.log(this); // prints DatagridComponent :(
}

HTML,將 onSelectUser 作為函數傳遞:

<app-datagrid [onSelection]="onSelectUser"></app-datagrid>

子元件:

@Component({
  selector: 'app-datagrid',
  templateUrl: './datagrid.component.html',
  styleUrls: ['./datagrid.component.css']
})
export class DatagridComponent implements OnInit {
  @Input() onSelection: () => {};

  onSelectListItem(item: any) {

    // some code

    if (this.onSelection) {
      this.onSelection(); // is executed, results see comments in parent component
    }
  }
}

子組件的 HTML:

<div *ngFor="let item of items" (click)="onSelectListItem(item)">
   ....
</div>

我該如何完成這個?

答案#1

這個問題更多是關於 this 上下文,你可以這樣修復它:

onSelectUser = ()=>{ // note this part 
    this.showUsergroupDetails = false;
    this.showUserDetails = true;
    console.log(this.showUsergroupDetails); // prints false, as expected
    console.log(this.showUserDetails); // prints true, as expected
    console.log(this); // prints DatagridComponent :(
}

我們使用胖箭頭來保持函數內當前元件的上下文

答案#2

使用 Output 事件從子元件與父元件通信。使用 Input 屬性綁定將資料從 parent 傳遞到子元件

Html

<app-datagrid (onSelection)="onSelectUser($event)"></app-datagrid>

元件

@Component({
  selector: 'app-datagrid',
  templateUrl: './datagrid.component.html',
  styleUrls: ['./datagrid.component.css']
})
export class DatagridComponent implements OnInit {
  @Output() onSelection: EventEmitter<any> = new EventEmitter();

  onSelectListItem(item: any) {
     this.onSelection.emit(item);
  }
}

//app-user-management method will receive item object
onSelectUser(item: any) {
   //here you would have item object.
}

另見元件互動