Răsfoiți Sursa

compile refactor wip

Evan You 10 ani în urmă
părinte
comite
7bd8aa27c9

+ 5 - 1
src/compiler/compile-props.js

@@ -142,7 +142,11 @@ function makePropsLinkFn (props) {
             _.initProp(vm, prop, value)
           } else {
             // dynamic binding
-            vm._bindDir('prop', null, prop, propDef, null, scope)
+            vm._bindDir({
+              name: 'prop',
+              def: propDef,
+              prop: prop
+            }, null, null, scope)
           }
         } else {
           process.env.NODE_ENV !== 'production' && _.warn(

+ 26 - 20
src/compiler/compile.js

@@ -336,9 +336,14 @@ function processTextToken (token, options) {
     }
   }
   function setTokenType (type) {
-    token.type = type
-    token.def = publicDirectives[type] // text or html
-    token.descriptor = dirParser.parse(token.value)
+    if (token.descriptor) return
+    var parsed = dirParser.parse(token.value)
+    token.descriptor = {
+      name: type,
+      def: publicDirectives[type],
+      expression: parsed.expression,
+      filters: parsed.filters
+    }
   }
   return el
 }
@@ -368,8 +373,7 @@ function makeTextNodeLinkFn (tokens, frag) {
             node.data = value
           }
         } else {
-          vm._bindDir(token.type, node,
-                      token.descriptor, token.def, host, scope)
+          vm._bindDir(token.descriptor, node, host, scope)
         }
       }
     }
@@ -458,12 +462,16 @@ function checkElementDirectives (el, options) {
  */
 
 function checkComponent (el, options, hasAttrs) {
+  // TODO handle literal/dynamic
   var componentId = _.checkComponent(el, options, hasAttrs)
+  var descriptor = {
+    name: 'component',
+    expression: componentId,
+    def: publicDirectives.component
+  }
   if (componentId) {
     var componentLinkFn = function (vm, el, host, scope, frag) {
-      vm._bindDir('component', el, {
-        expression: componentId
-      }, publicDirectives.component, host, scope, frag)
+      vm._bindDir(descriptor, el, host, scope, frag)
     }
     componentLinkFn.terminal = true
     return componentLinkFn
@@ -510,11 +518,16 @@ skip.terminal = true
  */
 
 function makeTerminalNodeLinkFn (el, dirName, value, options, def) {
-  var descriptor = dirParser.parse(value)
-  // either an element directive, or if/for
-  def = def || publicDirectives[dirName]
+  var parsed = dirParser.parse(value)
+  var descriptor = {
+    name: dirName,
+    expression: parsed.expression,
+    filters: parsed.filters,
+    // either an element directive, or if/for
+    def: def || publicDirectives[dirName]
+  }
   var fn = function terminalNodeLinkFn (vm, el, host, scope, frag) {
-    vm._bindDir(dirName, el, descriptor, def, host, scope, frag)
+    vm._bindDir(descriptor, el, host, scope, frag)
   }
   fn.terminal = true
   return fn
@@ -618,7 +631,6 @@ function compileDirectives (attrs, options) {
     dirs.push(dir)
   }
 
-  // sort by priority, LOW to HIGH
   if (dirs.length) {
     return makeNodeLinkFn(dirs)
   }
@@ -636,13 +648,7 @@ function makeNodeLinkFn (directives) {
     // reverse apply because it's sorted low to high
     var i = directives.length
     while (i--) {
-      var dir = directives[i]
-      var desc = {
-        expression: dir.expression,
-        filters: dir.filters
-      }
-      vm._bindDir(dir.name, el,
-        desc, dir.def, host, scope, frag, dir.arg, dir.literal)
+      vm._bindDir(directives[i], el, host, scope, frag)
     }
   }
 }

+ 1 - 1
src/directive.js

@@ -32,12 +32,12 @@ function Directive (name, el, vm, descriptor, def, host, scope, frag, arg, liter
   this.el = el
   this.vm = vm
   // copy descriptor props
+  this.descriptor = descriptor
   this.expression = descriptor.expression
   this.arg = arg || descriptor.arg
   this.filters = descriptor.filters
   // private
   this._def = def
-  this._descriptor = descriptor
   this._locked = false
   this._bound = false
   this._listeners = null

+ 1 - 1
src/directives/internal/prop.js

@@ -14,7 +14,7 @@ module.exports = {
     var child = this.vm
     var parent = child._context
     // passed in from compiler directly
-    var prop = this._descriptor
+    var prop = this.descriptor.prop
     var childKey = prop.path
     var parentKey = prop.parentPath
 

+ 7 - 2
src/instance/lifecycle.js

@@ -103,9 +103,14 @@ exports._initElement = function (el) {
  * @param {Fragment} [frag] - owner fragment
  */
 
-exports._bindDir = function (name, node, desc, def, host, scope, frag, arg, literal) {
+exports._bindDir = function (dir, node, host, scope, frag) {
+  var desc = {
+    expression: dir.expression,
+    filters: dir.filters,
+    prop: dir.prop
+  }
   this._directives.push(
-    new Directive(name, node, this, desc, def, host, scope, frag, arg, literal)
+    new Directive(dir.name, node, this, desc, dir.def, host, scope, frag, dir.arg, dir.literal)
   )
 }