* [html5] fix call loop.

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/31411dd4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/31411dd4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/31411dd4

Branch: refs/heads/master
Commit: 31411dd4afd383cb4a25bd666830615c9c14e6d5
Parents: 902a1f7
Author: MrRaindrop <tekk...@gmail.com>
Authored: Fri Aug 25 15:19:01 2017 +0800
Committer: MrRaindrop <tekk...@gmail.com>
Committed: Fri Aug 25 15:19:01 2017 +0800

----------------------------------------------------------------------
 html5/render/vue/README.md            |  2 +-
 html5/render/vue/core/node.js         | 33 +++++++++++++++++++++++++-----
 html5/render/vue/env/event-manager.js | 19 ++++++++---------
 package.json                          |  2 +-
 packages/weex-vue-render/README.md    |  2 +-
 packages/weex-vue-render/package.json |  2 +-
 6 files changed, 41 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/README.md
----------------------------------------------------------------------
diff --git a/html5/render/vue/README.md b/html5/render/vue/README.md
index 41df16b..bcdd2de 100644
--- a/html5/render/vue/README.md
+++ b/html5/render/vue/README.md
@@ -142,7 +142,7 @@ vue: {
 
 * fix scanning style in production with uglified code.
 
-#### 0.12.6
+#### 0.12.8
 
 * optimize event binding.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/core/node.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/core/node.js b/html5/render/vue/core/node.js
index d38cafd..4cef067 100644
--- a/html5/render/vue/core/node.js
+++ b/html5/render/vue/core/node.js
@@ -54,6 +54,30 @@ function getListeners (vnode, evt) {
 }
 
 /**
+ * Instead of vue's invoker, this function should check if the binding function
+ * has a _weex_hook flag. If there is one, the handler should not be triggered.
+ * @param {Array | Function} fns
+ */
+export function applyFns (fns, ...args) {
+  if (Array.isArray(fns)) {
+    const cloned = fns.slice()
+    const len = cloned.length
+    for (let i = 0; i < len; i++) {
+      const fn = cloned[i]
+      if (fn._weex_hook) {
+        continue
+      }
+      fn.apply(null, args)
+    }
+  }
+  else {
+    if (!fns._weex_hook) {
+      fns.apply(null, args)
+    }
+  }
+}
+
+/**
  * emit native events to enable v-on.
  * @param {VComponent} context: which one to emit a event on.
  * @param {array | object} events: extra events. You can pass in multiple 
arguments here.
@@ -90,11 +114,8 @@ export function createEventMap (context, ...events) {
             if (len > 0) {
               let idx = 0
               while (idx < len) {
-                let on = ons[idx]
-                if (on && on.fn) {
-                  on = on.fn
-                }
-                on && on.call(vm, e)
+                const on = ons[idx]
+                applyFns(on.fns, e)
                 idx++
               }
               // once a parent node (or self node) has triggered the handler, 
then
@@ -107,6 +128,8 @@ export function createEventMap (context, ...events) {
             vm = vm.$parent
           }
         }
+        // flag to distinguish from user-binding listeners.
+        handler._weex_hook = true
       }
       if (!eventMap[evtName]) {
         eventMap[evtName] = []

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/html5/render/vue/env/event-manager.js
----------------------------------------------------------------------
diff --git a/html5/render/vue/env/event-manager.js 
b/html5/render/vue/env/event-manager.js
index 3ecf618..c19a649 100644
--- a/html5/render/vue/env/event-manager.js
+++ b/html5/render/vue/env/event-manager.js
@@ -19,6 +19,7 @@
 
 import config from '../config'
 import { createEvent, supportsPassive } from '../utils'
+import { applyFns } from '../core'
 
 const gestureEvents = config.gestureEvents
 const nativeEvents = ['click', 'touchstart', 'touchmove', 'touchend']
@@ -112,13 +113,11 @@ function _init (doc) {
 
         if (len > 0) {
           for (let i = 0; i < len; i++) {
-            let handler = ons[i]
-            if (handler && handler.fn) {
-              handler = handler.fn
-            }
-            // create a no bubble event.
-            const newEvt = createEvent(el, evt)
-            handler && handler.call(vm, newEvt)
+            const handler = ons[i]
+            const newEvt = evtName === 'click'
+              ? createEvent(el, evtName)
+              : e
+            applyFns(handler.fns, newEvt)
           }
           e._triggered = { target: vm.$el }
           disposed = true
@@ -127,8 +126,8 @@ function _init (doc) {
         /**
          * if the handler is binding on a <a> element, should trigger
          * the handler first and then jump to href.
-         * NOTE: if target==='_blank' then do no jumping and dispatch the
-         * click event to document.body for further disposing.
+         * NOTE: if target==='_blank' then do no jumping and leave it
+         * to users binding handlers for further disposing.
          */
         if (evtName === 'click' && isANode(elm)) {
           const href = elm.getAttribute('href')
@@ -138,7 +137,7 @@ function _init (doc) {
             location.href = href
           }
           else {
-            document.body.dispatchEvent(e)
+            // do nothing.
           }
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 47b84dd..0b79cde 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
   "subversion": {
     "browser": "0.5.0",
     "framework": "0.21.11",
-    "vue-render": "0.12.7",
+    "vue-render": "0.12.8",
     "transformer": ">=0.1.5 <0.5"
   },
   "description": "A framework for building Mobile cross-platform UI",

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/packages/weex-vue-render/README.md
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/README.md 
b/packages/weex-vue-render/README.md
index 41df16b..bcdd2de 100644
--- a/packages/weex-vue-render/README.md
+++ b/packages/weex-vue-render/README.md
@@ -142,7 +142,7 @@ vue: {
 
 * fix scanning style in production with uglified code.
 
-#### 0.12.6
+#### 0.12.8
 
 * optimize event binding.
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/31411dd4/packages/weex-vue-render/package.json
----------------------------------------------------------------------
diff --git a/packages/weex-vue-render/package.json 
b/packages/weex-vue-render/package.json
index 1262ef1..b29cfdc 100644
--- a/packages/weex-vue-render/package.json
+++ b/packages/weex-vue-render/package.json
@@ -1,6 +1,6 @@
 {
   "name": "weex-vue-render",
-  "version": "0.12.7",
+  "version": "0.12.8",
   "description": "Weex built-in components for Vue 2.x.",
   "license": "Apache-2.0",
   "main": "dist/index.common.js",

Reply via email to