| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* @flow */
- import { toArray } from '../util/index'
- import { updateListeners } from '../vdom/helpers/index'
- export function initEvents (vm: Component) {
- vm._events = Object.create(null)
- // init parent attached events
- const listeners = vm.$options._parentListeners
- if (listeners) {
- updateComponentListeners(vm, listeners)
- }
- }
- let target: Component
- function add (event, fn, once) {
- if (once) {
- target.$once(event, fn)
- } else {
- target.$on(event, fn)
- }
- }
- function remove (event, fn) {
- target.$off(event, fn)
- }
- export function updateComponentListeners (
- vm: Component,
- listeners: Object,
- oldListeners: ?Object
- ) {
- target = vm
- updateListeners(listeners, oldListeners || {}, add, remove, vm)
- }
- export function eventsMixin (Vue: Class<Component>) {
- Vue.prototype.$on = function (event: string, fn: Function): Component {
- const vm: Component = this
- ;(vm._events[event] || (vm._events[event] = [])).push(fn)
- return vm
- }
- Vue.prototype.$once = function (event: string, fn: Function): Component {
- const vm: Component = this
- function on () {
- vm.$off(event, on)
- fn.apply(vm, arguments)
- }
- on.fn = fn
- vm.$on(event, on)
- return vm
- }
- Vue.prototype.$off = function (event?: string, fn?: Function): Component {
- const vm: Component = this
- // all
- if (!arguments.length) {
- vm._events = Object.create(null)
- return vm
- }
- // specific event
- const cbs = vm._events[event]
- if (!cbs) {
- return vm
- }
- if (arguments.length === 1) {
- vm._events[event] = null
- return vm
- }
- // specific handler
- let cb
- let i = cbs.length
- while (i--) {
- cb = cbs[i]
- if (cb === fn || cb.fn === fn) {
- cbs.splice(i, 1)
- break
- }
- }
- return vm
- }
- Vue.prototype.$emit = function (event: string): Component {
- const vm: Component = this
- let cbs = vm._events[event]
- if (cbs) {
- cbs = cbs.length > 1 ? toArray(cbs) : cbs
- const args = toArray(arguments, 1)
- for (let i = 0, l = cbs.length; i < l; i++) {
- cbs[i].apply(vm, args)
- }
- }
- return vm
- }
- }
|