hàm gọi angle2 của thành phần mẹ


83

Tôi có một ứng dụng trong đó tôi có thành phần tải lên để tôi có thể tải tệp lên. Nó được nhúng trong body.component.

Khi tải lên, nó nên sử dụng một hàm (ví dụ BodyComponent.thefunction()) của thành phần mẹ (thực hiện lệnh gọi để cập nhật dữ liệu): nhưng chỉ khi thành phần gốc cụ thể là body.component. Tải lên cũng có thể được sử dụng ở những nơi khác với hành vi khác.

Một cái gì đó như parent(this).thefunction(), làm thế nào để làm điều đó?

Câu trả lời:


145

Tôi sẽ tạo một sự kiện tùy chỉnh trong thành phần con. Đại loại vậy:

@Component({
  selector: 'child-comp',
  (...)
})
export class ChildComponent {
  @Output()
  uploaded = new EventEmitter<string>();

  uploadComplete() {
    this.uploaded.emit('complete');
  }

Thành phần chính của bạn có thể đăng ký vào sự kiện này

@Component({
  template `
    <child-comp (uploaded)="someMethod($event)"></child-comp>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  (...)

  someMethod(event) {
  }
}

Một cách khác sẽ là đưa thành phần cha vào thành phần con nhưng chúng sẽ được liên kết chặt chẽ với nhau ...


Bất kỳ ý tưởng tại sao tôi gặp lỗi đầu ra không xác định? Nó được xác định trong bảng chữ ở trên cùng bằng cách nhập từ angular2/core. Console log show một vấn đề với angular2-polyfills
PascalVKooten

Ồ, có một lỗi đánh máy trong câu trả lời của tôi: @Ouputthay vì @Output. Nó có thể là vấn đề ... Tôi đã cập nhật câu trả lời của mình.
Thierry Templier

Heh, không để ý. Điều đó là vậy đó.
PascalVKooten

Bây giờ nhận được một uploadComplete is not definedGhi chú mà tôi chỉ sao chép chúng làm ví dụ. Phụ huynh cũng có "someMethod", nhưng nó đã có vấn đề với uploadComplete. Thành phần mẹ sử dụng liên kết (đã tải lên) trên nút con và nó đã có nút con làm chỉ thị.
PascalVKooten

3
các lệnh và đường ống bên trong @Component không được chấp nhận từ RC6 góc cạnh.
alex351

47

Dưới đây là làm việc cho tôi mới nhất

Angular5

class ChildComponent {
  @Output() myEvent = new EventEmitter<string>();

  callParent() {
    this.myEvent.emit('eventDesc');
  }
}

Trong ParentTemplatemẫu của

<child-component (myEvent)="anyParentMehtod($event)"

3
Đây là một giải pháp tốt, bởi vì nó đơn giản và cha mẹ quyết định phương thức nào sẽ gọi. Tôi thích :-)
Jette

1
Điều gì sẽ xảy ra nếu tôi đang sử dụng bộ định tuyến-ổ cắm? Tôi vẫn có thể sử dụng (myEvent) chứ?
Robert Williams

Thành phần con của nó được sử dụng bên trong thành phần mẹ. Không chắc chắn Giới thiệu về bộ định tuyến-ổ cắm. Có thể câu hỏi này sẽ giúp bạn. stackoverflow.com/questions/45949476/…
Shabbir Dhangot,

30

Giải pháp không có sự kiện liên quan.

Giả sử rằng tôi có một ChildComponentvà từ đó tôi muốn gọi phương thức myMethod()thuộc về ParentComponent(giữ nguyên ngữ cảnh gốc ban đầu).

Lớp thành phần chính:

@Component({ ... })
export class ParentComponent {

    get myMethodFunc() {
        return this.myMethod.bind(this);
    }

    myMethod() {
         ...
    }
}

Mẫu chính:

<app-child [myMethod]="myMethodFunc"></app-child>

Mẫu con

@Component({ ... })
export class ChildComponent {

    @Input() myMethod: Function;

    // here I can use this.myMethod() and it will call ParentComponent's myMethod()
}

1
Tôi đã thử sử dụng cái này nhưng nó không hiệu quả với tôi. Trong phiên bản myMethod của tôi, nó tham chiếu đến một tập hợp các tab trên thành phần chính (tôi đang cố chuyển các tab từ con của thành phần chính). Khi tôi tham chiếu điều này trong cha mẹ, mọi thứ đều hoạt động. Từ đứa trẻ, nó đi vào myMethod, nhưng không thay đổi tab. Vì vậy, tôi đang tự hỏi liệu tập tab mà nó đang tham chiếu có phải là bản sao của tập thật khi đứa trẻ đang truy cập nó hay không. Tôi thực sự không chắc những gì đang xảy ra ở đây khi this.myMethod.bind(this)được trả lại. (Có thể tôi thay vì làm điều gì đó sai lầm cơ bản.)
Katharine Osborne

Tôi biết nhưng tôi không sử dụng phiên bản thứ 8. Tôi cần cái này cho Ionic 3 sử dụng phiên bản 5.
Vasilis Hy Lạp

@VasilisGreece Tôi không chắc chắn làm thế nào để giúp bạn, nhưng tôi đề nghị bạn cập nhật mới nhất Ionic phiên bản (hiện 4)
Francesco Borzi

23

Bạn có thể đưa thành phần cha vào thành phần con.

Để biết thêm chi tiết, hãy xem
- Làm cách nào để đưa một thành phần mẹ vào một thành phần con?
- Thành phần con Angular 2 tham chiếu đến thành phần cha Bằng cách này bạn có thể đảm bảo rằng thefunction()chỉ được gọi khi cha là a body.component.

constructor(@Host() bodyComp: BodyComponent) {

Nếu không, việc sử dụng @Output()được ưu tiên để giao tiếp từ trẻ em sang phụ huynh.


1
Btw, tôi phải làm constructor(@Host() bodyComp: BodyComponent).. có lẽ nó đã được thay đổi gần đây. Hoạt động tuyệt vời, thx!
Eddy Verbruggen

Thanjs rất nhiều, tôi hỗn hợp lên một cái gì đó - cố định
Günter Zöchbauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.