Sistema de Eventos
O sistema de eventos implementa o modelo publisher / subscriber. Ele pode ser usado para passar dados entre páginas, por exemplo.
e.g.
Em event-bus.js
import { EventSystem } from 'mamba-websdk'
export const EventBus = new EventSystem()
Em page1.js
import { EventBus } from '../shared/event-bus.js'
export default {
props: {
myProp: '123'
},
onCreate() {
EventBus.on('action', this.runOnAction, this)
},
methods: {
runOnAction (arg1, arg2) {
console.log(arg1)
console.log(arg2)
console.log(this.myProp)
}
}
}
Em page2.js
import { EventBus } from '../shared/event-bus.js'
export default {
onUpdate() {
EventBus.emit('action', 'abc', 123)
}
}
Apesar de ser possível passar dados entre os componentes desta maneira, existem alguns problemas. Note que o componente só irá se inscrever no sistema de eventos se ele já tiver sido criado; desta forma, a ordem que os componentes são criados afetam o comportamento do sistema. Além disso, não é possível saber o estado do sistema a qualquer momento.
Recomendamos criar uma Store simples, que incorpora o sistema de eventos mas mantém o estado do sistema.
Template da estrutura
Em shared/todo.ts
class Todo {
public message: string = ''
public creationDate: Date
constructor(message: string) {
this.message = message
this.creationDate = new Date()
}
}
class TodoSystem {
private todos: Array<string> = []
add (todo: string) {
todos.push(new Todo(todo))
}
update (oldTodo: string, newTodo: string) {
this.todos
.filter(todo => todo.message === oldTodo)
.forEach(todo => todo.message = newTodo)
}
deleteTodo (todo: string) {
this.todos = this.todos.filter(_todo => _todo.message !== todo)
}
getTodos (): Array<string> {
return this.todos.map(todo => todo.message)
}
}
export TodoSystem
Em shared/todo-actions.ts
enum TodoActions {
ADD,
UPDATE,
DELETE
}
export default TodoActions
Em shared/todo-store.ts
import { EventSystem } from 'mamba-websdk'
import TodoActions from './todo-actions'
import TodoSystem from './todo-system'
class TodoStore extends EventSystem {
private todos: TodoSystem = new TodoSystem()
add (todo: string) {
todos.add(todo)
super.emit(TodoActions.ADD, todo)
}
update (oldTodo: string, newTodo: string) {
todos.update(oldTodo, newTodo)
super.emit(TodoActions.UPDATE, oldTodo, newTodo)
}
deleteTodo (todo: string) {
todos.deleteTodo(todo)
super.emit(TodoActions.DELETE, todo)
}
getTodos () {
return todos.getTodos()
}
}
export const TodoStore = new TodoStore()
Desta forma é possível saber o estado do sistema a qualquer momento, além de poder se inscrever em eventos.
e.g.
import TodoStore from '../../shared/todo-store'
import TodoActions from '../../shared/todo-actions'
TodoStore.on(TodoActions.ADD, (todo) => console.log(`added todo: ${todo}`))
TodoStore.on(TodoActions.UPDATE, (old, new) => console.log(`updated todo from '${old}' to '${new}'`))
TodoStore.on(TodoActions.DELETE, (todo) => console.log(`deleted todo: ${todo}`))
TodoStore.add('First todo')
TodoStore.add('Second todo')
TodoStore.add('Do it now')
TodoStore.update('Do it now', 'Do it later')
TodoStore.delete('Do it later')
TodoStore.getTodos().forEach(todo => console.log(todo))
// Saída:
// added todo: First todo
// added todo: Second todo
// added todo: Do it now
// updated todo from 'Do it now' to 'Do it later'
// deleted todo: Do it later
// First todo
// Second todo
on (eventName: string, callback: EventCallback, thisArg: Object = null): void
Cadastra uma callback no sistema de eventos. A callback receberá como parâmetros tudo o que for passado pelo método emit
Parâmetro | Tipo | Descrição |
---|---|---|
eventName | string | Nome do evento para cadastro |
callback | function | Função de callback que será chamada quando o evento for emitido |
thisArg | Object? | Contexto aplicado à callback |
e.g.
import { EventSystem } from 'mamba-websdk'
const EventBus = new EventSystem()
EventBus.on('my-event', (arg1, arg2) => console.log(arg1, arg2))
EventBut.emit('my-event')
EventBut.emit('my-event', '123', abc)
// Saída:
// undefined undefined
// 123 abc
off (eventName: string, callback: EventCallback): void
Remove uma callback cadastrada do sistema de eventos para o evento desejado
Parâmetro | Tipo | Descrição |
---|---|---|
eventName | string | Nome do evento para cadastro |
callback | function | Função de callback que será chamada quando o evento for emitido |
import { EventSystem } from 'mamba-websdk'
const EventBus = new EventSystem()
function logFirstArg (arg) {
console.log(arg)
}
EventBus.on('my-event', logFirstArg)
EventBut.emit('my-event', 123)
EventBus.off('my-event', logFirstArg)
EventBut.emit('my-event', 456)
// Saída:
// 123
emit (eventName: string, …args: any[]): void
Emite um evento. O primeiro argumento é o nome do evento; todos os outros argumentos serão passados para as callbacks cadastradas para o evento
Parâmetro | Tipo | Descrição |
---|---|---|
eventName | string | Nome do evento para cadastro |
…args | any | Argumentos passados para as callbacks |