Jelajahi Sumber

fix #498 nested instance not passing $event

Evan You 11 tahun lalu
induk
melakukan
14bcc27444
2 mengubah file dengan 32 tambahan dan 3 penghapusan
  1. 2 3
      src/directives/on.js
  2. 30 0
      test/unit/specs/directives/on_spec.js

+ 2 - 3
src/directives/on.js

@@ -29,12 +29,11 @@ module.exports = {
     }
     this.reset()
     var vm = this.vm
-    var root = vm.$root
     this.handler = function (e) {
       e.targetVM = vm
-      root.$event = e
+      vm.$event = e
       var res = handler(e)
-      root.$event = null
+      vm.$event = null
       return res
     }
     if (this.iframeBind) {

+ 30 - 0
test/unit/specs/directives/on_spec.js

@@ -6,6 +6,7 @@ function trigger (target, event, process) {
   e.initEvent(event, true, true)
   if (process) process(e)
   target.dispatchEvent(e)
+  return e
 }
 
 if (_.inBrowser) {
@@ -100,5 +101,34 @@ if (_.inBrowser) {
       document.body.removeChild(el)
     })
 
+    it('passing $event', function () {
+      var test = jasmine.createSpy()
+      var vm = new Vue({
+        el: el,
+        template: '<a v-on="click:test($event)"></a>',
+        methods: {
+          test: test
+        }
+      })
+      var e = trigger(el.firstChild, 'click')
+      expect(test).toHaveBeenCalledWith(e)
+    })
+
+    it('passing $event on a nested instance', function () {
+      var test = jasmine.createSpy()
+      var parent = new Vue({
+        methods: {
+          test: test
+        }
+      })
+      var child = parent.$addChild({
+        el: el,
+        inherit: true,
+        template: '<a v-on="click:test($event)"></a>'
+      })
+      var e = trigger(el.firstChild, 'click')
+      expect(test).toHaveBeenCalledWith(e)
+    })
+
   })
 }