Przeglądaj źródła

only emit get events during deps parsing - improves perf

Evan You 12 lat temu
rodzic
commit
23bd49fa08
4 zmienionych plików z 25 dodań i 19 usunięć
  1. 5 7
      src/compiler.js
  2. 2 2
      src/deps-parser.js
  3. 4 1
      src/observer.js
  4. 14 9
      test/unit/specs/observer.js

+ 5 - 7
src/compiler.js

@@ -8,7 +8,8 @@ var Emitter     = require('./emitter'),
     DepsParser  = require('./deps-parser'),
     ExpParser   = require('./exp-parser'),
     transition  = require('./transition'),
-
+    // cache deps ob
+    depsOb      = DepsParser.observer,
     // cache methods
     slice       = Array.prototype.slice,
     log         = utils.log,
@@ -163,8 +164,7 @@ CompilerProto.setupObserver = function () {
 
     var compiler = this,
         bindings = compiler.bindings,
-        observer = compiler.observer = new Emitter(),
-        depsOb   = DepsParser.observer
+        observer = compiler.observer = new Emitter()
 
     // a hash to hold event proxies for each root level key
     // so they can be referenced and removed later
@@ -174,9 +174,7 @@ CompilerProto.setupObserver = function () {
     observer
         .on('get', function (key) {
             check(key)
-            if (depsOb.isObserving) {
-                depsOb.emit('get', bindings[key])
-            }
+            depsOb.emit('get', bindings[key])
         })
         .on('set', function (key, val) {
             observer.emit('change:' + key, val)
@@ -492,7 +490,7 @@ CompilerProto.define = function (key, binding) {
         enumerable: true,
         get: function () {
             var value = binding.value
-            if ((!binding.isComputed && (!value || !value.__observer__)) ||
+            if (depsOb.active && (!binding.isComputed && (!value || !value.__observer__)) ||
                 Array.isArray(value)) {
                 // only emit non-computed, non-observed (primitive) values, or Arrays.
                 // because these are the cleanest dependencies

+ 2 - 2
src/deps-parser.js

@@ -33,9 +33,9 @@ module.exports = {
      */
     parse: function (bindings) {
         utils.log('\nparsing dependencies...')
-        observer.isObserving = true
+        observer.active = true
         bindings.forEach(catchDeps)
-        observer.isObserving = false
+        observer.active = false
         utils.log('\ndone.')
     }
     

+ 4 - 1
src/observer.js

@@ -2,6 +2,7 @@
 
 var Emitter  = require('./emitter'),
     utils    = require('./utils'),
+    depsOb   = require('./deps-parser').observer,
 
     // cache methods
     typeOf   = utils.typeOf,
@@ -116,7 +117,9 @@ function bind (obj, key, path, observer) {
         enumerable: true,
         get: function () {
             // only emit get on tip values
-            if (!watchable) observer.emit('get', fullKey)
+            if (depsOb.active && !watchable) {
+                observer.emit('get', fullKey)
+            }
             return values[fullKey]
         },
         set: function (newVal) {

+ 14 - 9
test/unit/specs/observer.js

@@ -1,7 +1,8 @@
 describe('UNIT: Observer', function () {
 
     var Observer = require('seed/src/observer'),
-        Emitter  = require('emitter')
+        Emitter  = require('emitter'),
+        DepsOb   = require('seed/src/deps-parser').observer
     
     describe('Observing Object', function () {
         
@@ -31,14 +32,18 @@ describe('UNIT: Observer', function () {
             path: 'test'
         }))
 
-        it('should emit get events on tip values', getTestFactory({
-            obj: { a: 1, b: { c: 2 } },
-            expects: [
-                'test.a',
-                'test.b.c'
-            ],
-            path: 'test'
-        }))
+        it('should emit get events on tip values', function () {
+            DepsOb.active = true
+            getTestFactory({
+                obj: { a: 1, b: { c: 2 } },
+                expects: [
+                    'test.a',
+                    'test.b.c'
+                ],
+                path: 'test'
+            })()
+            DepsOb.active = false
+        })
 
         it('should emit set when first observing', function () {
             var obj = { a: 1, b: { c: 2} },