2016-02-12 29 views
6

Tôi gặp sự cố trong đó EventEmitter không xuất giá trị cho thành phần gốc. Đây là cách tôi đang thiết lập.Góc 2 EventEmitter

main.component.ts (phiên bản ngắn)

...  

@Component({ 
selector: 'my-app', 
templateUrl: '/app/views/main.ejs', 
directives: [ROUTER_DIRECTIVES], 
providers:[AuthService], 
inputs:['userLoggedIn'] 
}) 

@RouteConfig([ 
{path:'/logout', name: 'Logout', component: AuthComponent}, 

]) 

export class AppComponent implements OnInit, CanReuse{ 

    constructor(private _auth_service: AuthService){ 

     this._auth_service.authChanged.subscribe(data=>this.authChangedHandler(data)); 

    } 

    public authChangedHandler($event){ 

     alert($event); 

    } 

} 

... 

auth.component.ts (phiên bản ngắn)

export class AuthComponent implements OnInit, CanReuse{ 

public loggedIn = false; 

public user = {}; 

@Output() 
authChanged: EventEmitter<string>; 

public selectedTab = "/login"; 

    constructor(private _router: Router, private _location:Location,private _http: Http, private _auth_service: AuthService){ 

     this.authChanged = new EventEmitter(); 

     this.authChanged.emit("authChanged"); 

    } 

} 

main.ejs (phiên bản ngắn)

<nav (authChanged)="authChangedHandler($event)"></nav> 
<router-outlet></router-outlet> 
.210

auth.service.ts

export class AuthService { 

public authChanged: EventEmitter<string>; 

constructor(private _http: Http){ 

    this.authChanged = new EventEmitter(); 
    this.authChanged.emit("authChanged"); 

    } 

} 

EDIT: Tôi đã thêm AuthService mã mà tôi tiêm vào phần chính. Nó sẽ làm việc bây giờ nhưng không.

+0

Bạn đã nhận được giải pháp cho nó chưa? Tôi cũng đang tìm cách nắm bắt một sự kiện được phát ra từ thành phần được thêm vào trong @RouteConfig – Sanjeev

+0

@Sanjeev Vâng tôi đã làm. Tôi đã sử dụng Sự kiện dịch vụ. Tôi có một plunker tạo ra ở đây (https://plnkr.co/edit/WZ5HbvBP5LMSqZQtixoG?p=preview) – xmaestro

+0

Ý tưởng là để tiêm một dịch vụ tại bootstrap và dịch vụ đó sẽ chứa eventemitter mà mỗi thành phần có thể đăng ký, trên toàn cầu. – xmaestro

Trả lời

14

Sự kiện phát ra bởi EventEmitter không bị bong bóng. Nếu phần tử được thêm vào một số router-outlet chỉ router-outlet nhận sự kiện chứ không phải phần tử có chứa router-outlet.

Bạn có thể sử dụng dịch vụ dùng chung để liên lạc giữa phần tử cha và phần tử con.

Đối với dịch vụ chia sẻ thấy

Nếu bạn đăng ký dịch vụ chia sẻ trong providers: [] danh sách các thành phần phụ huynh, các dịch vụ được chia sẻ duy nhất giữa các yếu tố phụ huynh và tất cả các hậu duệ của nó. Nếu bạn chỉ thêm nó vào bootstrap(MyApp, [ ..., SharedService]) toàn bộ ứng dụng chia sẻ một ví dụ.

+0

Bạn có thể vui lòng giải thích chi tiết hơn về dịch vụ được chia sẻ không? Có lẽ một số mã? – xmaestro

+0

Có tôi đã thấy và tôi đã chọn cho Sự kiện dịch vụ và thực hiện các thay đổi đối với mã ở trên. Vui lòng xem các chỉnh sửa của tôi. – xmaestro

+0

Nếu bạn phát ra sự kiện trong hàm tạo của 'AuthService', sự kiện này được alredy gửi trước khi' AppComponent' có thể đăng ký. Đối với phép kiểm tra, hãy quấn 'emit (event)' trong 'AuthService' trong' setTimeout() 'để cung cấp thời gian' AppComponent' để đăng ký. Trong một ứng dụng thực tế, nó sẽ cháy sau đó. –

1

Trên thực tế, nav không phải là thành phần chính của thành phần AuthComponent. Cái sau có liên quan đến định tuyến (xem router-outlet). Đó là lý do tại sao bạn không thể nhận được sự kiện cho biểu thức đã đăng ký trên phần tử nav trong HTML.

+0

Xin vui lòng xem các chỉnh sửa của tôi.Các vấn đề 'nav' không quan trọng bây giờ kể từ khi tôi đang sử dụng dịch vụ sự kiện. ? – xmaestro

+0

Có, nhưng bạn nên sử dụng điều này: 'this._auth_service.authChanged.emit ('authChanged');' ;-) để kích hoạt sự kiện ... –

+0

Nhưng tôi phát ra nó từ dịch vụ. Không phải từ thành phần. – xmaestro