2017-07-16 90 views
2

一個月前,我發佈了一個小的library,它只是允許顯示一個加載動畫。角4事件發射器沒有捕捉任何訂閱

爲此,我的用戶只需將<ng-load></ng-load>添加到他們的模板中,並在其組件中注入LoadService並呼叫loadService.animate(true)(或false)。

對事物的庫邊我做到以下幾點:

在我的服務:

@Injectable() 
export class LoadService { 
    // My event emitter 
    @Output() animating: EventEmitter<any> = new EventEmitter(); 

    constructor() {} 

    // Method called by the user to display the animation, 
    // emits the value passed as parameter 
    public animate(val: boolean) { 
    this.animating.emit(val); 
    } 

    getValue(): any { 
    return this.animating; 
    } 
} 

而且在我的組件:

@Component({ 
    selector: 'ng-load', 
    templateUrl: './load.component.html', 
    styleUrls: ['./load.component.css'] 
}) 
export class LoadComponent implements OnInit {  
    animate: boolean; 

    constructor(public loadService: LoadService) {} 

    ngOnInit(): void { 
     // Listen to our event emitter 
     this.loadService.getValue().subscribe((status: boolean) => { 
      this.animate = status; 
     }); 
    } 
} 

HTML模板只是有一個<div *ngIf="animate">到顯示或隱藏CSS動畫。

所以我的事件發射器發射什麼我的用戶給予animate,和我的布爾值應該在我的成分發生變化,或因此它做了一個月前。

由於某種原因,我的事件發射器訂閱沒有任何東西。

是否已更改EventEmitters?我是否以錯誤的方式使用它們?

回答

2

您的代碼有多個問題。首先,@Output用於組件,而不是服務。其次,您正在訂閱getValue(),它不返回Observable,訂閱無法工作。第三,如果你想讓你的服務把數據推送給訂閱者,使用Rx.Subject是因爲EventEmitter只是Subject的另一個抽象層,它的行爲在將來可能會改變。

+0

這就是我認爲,在閱讀了關於EventEmitters的詳細信息之後,我現在意識到我的實現可能會在未來(或者現在,就此而言)導致問題。 對我而言,最好的方法是什麼?創建一個我的組件將訂閱的「Observable 」? – Christopher

+0

在getValue()中,嘗試返回Observable.of(this.animating)並從代碼中刪除@Output。 –

0

由於您使用的是基本數據類型boolean,因此可能會出現對象引用保持不變的情況,因此它不會觸發預訂。

  • 因此,使用一個複雜的對象

    let animation ={ 
         allowAnimation : true/false 
    }; 
    this.animating.emit(animation); // might trigger the subscription 
    
  • 增量計(數字)

    this.animating.emit(i++); 
    

注:如果第一種情況不觸發,那麼你可以改變參考併發射這將導致訂閱發射。