2
0
Evan You 12 жил өмнө
parent
commit
d48906d537

+ 2 - 2
src/observer/array-augmentations.js

@@ -42,8 +42,8 @@ var arrayAugmentations = Object.create(Array.prototype)
 
     ob.link(inserted)
     ob.unlink(removed)
-    // empty key, value is self
-    ob.emit('mutate', '', this, {
+    // empty path, value is the Array itself
+    ob.emit('mutate', [], this, {
       method   : method,
       args     : args,
       result   : result,

+ 37 - 28
src/observer/observer.js

@@ -3,17 +3,18 @@ var Emitter = require('../emitter')
 var arrayAugmentations = require('./array-augmentations')
 var objectAugmentations = require('./object-augmentations')
 
-// Type enums
+/**
+ * Type enums
+ */
 
 var ARRAY  = 0
 var OBJECT = 1
 
 /**
  * Observer class that are attached to each observed
- * object. They are essentially event emitters, but can
- * connect to each other like nodes to map the hierarchy
- * of data objects. Once connected, detected change events
- * can propagate up the nested object chain.
+ * object. Observers can connect to each other like nodes
+ * to map the hierarchy of data objects. Once connected,
+ * detected change events can propagate up the nested chain.
  *
  * The constructor can be invoked without arguments to
  * create a value-less observer that simply listens to
@@ -38,6 +39,34 @@ function Observer (value, type) {
 
 var p = Observer.prototype = Object.create(Emitter.prototype)
 
+/**
+ * Instead of the dot, we use the backspace character
+ * which is much less likely to appear as property keys
+ * in JavaScript.
+ */
+
+var delimiter = Observer.pathDelimiter = '\b'
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ *
+ * @param {*} value
+ * @return {Observer|undefined}
+ * @static
+ */
+
+Observer.create = function (value) {
+  if (value && value.$observer) {
+    return value.$observer
+  } if (_.isArray(value)) {
+    return new Observer(value, ARRAY)
+  } else if (_.isObject(value)) {
+    return new Observer(value, OBJECT)
+  }
+}
+
 /**
  * Initialize the observation based on value type.
  * Should only be called once.
@@ -94,7 +123,7 @@ p.observe = function (key, val) {
   // emit an initial set event
   this.emit('set', key, val)
   if (_.isArray(val)) {
-    this.emit('set', key + '.length', val.length)
+    this.emit('set', key + delimiter + 'length', val.length)
   }
 }
 
@@ -190,7 +219,7 @@ p.deliver = function (key, val) {
 
 p.add = function (key, ob) {
   var self = this
-  var base = key + '.'
+  var base = key + delimiter
   var adaptors = this.adaptors[key] = {}
 
   adaptors.get = function (path) {
@@ -211,7 +240,7 @@ p.add = function (key, ob) {
       : key
     self.emit('mutate', path, val, mutation)
     // also emit for length
-    self.emit('set', path + '.length', val.length)
+    self.emit('set', path + delimiter + 'length', val.length)
   }
 
   ob.on('get', adaptors.get)
@@ -234,24 +263,4 @@ p.remove = function (key, ob) {
     .off('mutate', adaptors.mutate)
 }
 
-/**
- * Attempt to create an observer instance for a value,
- * returns the new observer if successfully observed,
- * or the existing observer if the value already has one.
- *
- * @param {*} value
- * @return {Observer|undefined}
- * @static
- */
-
-Observer.create = function (value) {
-  if (value && value.$observer) {
-    return value.$observer
-  } if (_.isArray(value)) {
-    return new Observer(value, ARRAY)
-  } else if (_.isObject(value)) {
-    return new Observer(value, OBJECT)
-  }
-}
-
 module.exports = Observer

+ 10 - 3
src/vue.js

@@ -5,6 +5,7 @@ var Compiler = require('./compiler/compiler')
  * The exposed Vue constructor.
  *
  * @constructor
+ * @param {Object} [options]
  * @public
  */
 
@@ -12,7 +13,9 @@ function Vue (options) {
   this._compiler = new Compiler(this, options)
 }
 
-// mixin instance methods
+/**
+ * Mixin instance methods
+ */
 
 var p = Vue.prototype
 _.mixin(p, require('./instance/lifecycle'))
@@ -20,11 +23,15 @@ _.mixin(p, require('./instance/data'))
 _.mixin(p, require('./instance/dom'))
 _.mixin(p, require('./instance/events'))
 
-// mixin asset registers
+/**
+ * Mixin asset registers
+ */
 
 _.mixin(Vue, require('./api/asset-register'))
 
-// static methods
+/**
+ * Static methods
+ */
 
 Vue.config   = require('./api/config')
 Vue.use      = require('./api/use')

+ 2 - 1
test/unit/observer.js

@@ -1,4 +1,5 @@
 var Observer = require('../../src/observer/observer')
+var delimiter = Observer.pathDelimiter
 
 describe('Observer', function () {
 
@@ -21,7 +22,7 @@ describe('Observer', function () {
     obj.a = 3
     expect(spy).toHaveBeenCalledWith('a', 3, undefined)
     obj.b.c = 4
-    expect(spy).toHaveBeenCalledWith('b.c', 4, undefined)
+    expect(spy).toHaveBeenCalledWith('b' + delimiter + 'c', 4, undefined)
   })
 
 })