Qual é o uso adequado de um evento?

li perguntas como Access EventEmitter Service dentro da CustomHttp onde o usuário usa o EventEmitter em seu serviço, mas ele foi sugerido neste Comentário não usá-lo e usar observáveis diretamente em seus serviços.

Também li isto. pergunta onde a solução sugere passar o evento Emissor para a criança e assiná-lo.

a minha pergunta é : devo ou não subscrever manualmente uma Evento? Como devo usá-lo?

Author: Community, 2016-03-18

2 answers

Não, você não deve assinar manualmente.

EventEmitter é uma abstração angular2 e seu único propósito é emitir eventos em componentes. Citando um comentário de Rob Wormald

[...] EventEmitter is really an Angular abstraction, and should be used pretty much only for emitting custom Events in components. Caso contrário, basta usar Rx como se fosse qualquer outra biblioteca.

Isto é muito claro no caso do emissor. documentacao.

Utilização por directivas e Componentes para emitir eventos personalizados.

O que há de errado em usá-lo? O Angular2 nunca nos garante que o evento Continue a ser observável. Isso significa refactorar o nosso código se ele mudar. A única API a que devemos aceder é o seu método emit(). Nunca devemos subscrever manualmente um evento.

Tudo o que foi dito acima é mais claro neste Comentário de Ward Bell {[[28]} (recomendado para leia o artigo e a resposta a esse comentário. Citar a Referência

Não conte com que o EventEmitter continue a ser um observável!

Não conte com a presença dos operadores observáveis no futuro!

Estes serão depreciados em breve e provavelmente removidos antes da libertação.

Utilize o evento apenas para a ligação entre um filho e o componente pai. Não subscreva. Não chame nenhum desses métodos. Apenas chamada eve.emit()

O comentário dele está de acordo com o comentário do Rob há muito tempo. Então, como usá-lo correctamente?

Basta usá-lo para emitir eventos a partir do seu componente. Veja um exemplo a seguir.

@Component({
    selector : 'child',
    template : `
        <button (click)="sendNotification()">Notify my parent!</button>
    `
})
class Child {
    @Output() notifyParent: EventEmitter<any> = new EventEmitter();
    sendNotification() {
        this.notifyParent.emit('Some value to send to the parent');
    }
}

@Component({
    selector : 'parent',
    template : `
        <child (notifyParent)="getNotification($event)"></child>
    `
})
class Parent {
    getNotification(evt) {
        // Do something with the notification (evt) sent by the child!
    }
}
Como não usá-lo?
class MyService {
    @Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Pare aí mesmo... já estás errado...

Espero que estes dois exemplos simples esclareçam o uso adequado do evento.

Resposta:

Não, Não assines manualmente para eles, não os use em serviços. Use - os como é mostrado na documentação apenas para emitir eventos em componentes. Não derrotes a abstração angular.

 251
Author: Eric Martinez, 2017-05-23 12:03:04
Sim, vai em frente e usa-o.

EventEmitter is a public, documented type in the final Angular Core API. Se é ou não baseado em Observable é irrelevante; se os seus métodos documentados emit e subscribe se adequam ao que você precisa, então vá em frente e use-o.

Tal como indicado nos documentos:

Usa Rx.Observable but provides an adapter to make it work as specified here: https://github.com/jhusain/observable-spec

Uma vez uma referência a implementação da especificação está disponível, mude para ela.

Então eles queriam um objeto semelhante que se comportasse de certa forma, implementaram-no e tornaram-no público. Se fosse apenas uma abstração Angular interna que não deveria ser usada, não a teriam tornado pública. Há muitas vezes em que é útil ter um emissor que envia eventos de um tipo específico. Se esse é o teu caso de uso, força. If / when a reference implementation of the spec they link para estar disponível, deve ser uma substituição drop-in, assim como qualquer outro polifill.

Certifica-te apenas que o gerador que passas para a função subscribe() segue a especificação ligada. O objeto devolvido tem a garantia de ter um método unsubscribe que deve ser chamado para liberar quaisquer referências ao gerador (este é atualmente um objeto RxJS Subscription}, mas esse é de fato um detalhe de implementação que não deve ser dependente).

export class MyServiceEvent {
    message: string;
    eventId: number;
}

export class MyService {
    public onChange: EventEmitter<MyServiceEvent> = new EventEmitter<MyServiceEvent>();

    public doSomething(message: string) {
        // do something, then...
        this.onChange.emit({message: message, eventId: 42});
    }
}

export class MyConsumer {
    private _serviceSubscription;

    constructor(private service: MyService) {
        this._serviceSubscription = this.service.onChange.subscribe({
            next: (event: MyServiceEvent) => {
                console.log(`Received message #${event.eventId}: ${event.message}`);
            }
        })
    }

    public consume() {
        // do some stuff, then later...

        this.cleanup();
    }

    private cleanup() {
        this._serviceSubscription.unsubscribe();
    }
}

Toda a dura condenação e condenação previsões sombrias parecem derivar de um único comentário de fluxo de pilha de um único desenvolvedor em uma versão pré-lançamento do Angular 2.

 45
Author: Toby J, 2017-11-07 21:29:57