Skip to content

Commit 331bcc6

Browse files
committed
avoid duplicate Observer.convert()
1 parent 0108e71 commit 331bcc6

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

src/compiler.js

+12-10
Original file line numberDiff line numberDiff line change
@@ -470,25 +470,27 @@ CompilerProto.define = function (key, binding) {
470470
log(' defined root binding: ' + key)
471471

472472
var compiler = this,
473-
data = compiler.data,
474-
vm = compiler.vm,
475-
value = binding.value = data[key] // save the value before redefinening it
476-
477-
if (utils.typeOf(value) === 'Object' && value.$get) {
478-
compiler.markComputed(binding)
479-
}
473+
data = compiler.data,
474+
vm = compiler.vm,
475+
ob = data.__observer__
480476

481477
if (!(key in data)) {
482478
data[key] = undefined
483479
}
484480

485-
// if the data object is already observed, that means
486-
// this binding is created late. we need to observe it now.
487-
if (data.__observer__) {
481+
// if the data object is already observed, but the key
482+
// is not observed, we need to add it to the observed keys.
483+
if (ob && !(key in ob.values)) {
488484
Observer.convert(data, key)
489485
}
490486

487+
var value = binding.value = data[key]
488+
if (utils.typeOf(value) === 'Object' && value.$get) {
489+
compiler.markComputed(binding)
490+
}
491+
491492
Object.defineProperty(vm, key, {
493+
enumerable: !binding.isComputed,
492494
get: binding.isComputed
493495
? function () {
494496
return compiler.data[key].$get()

src/observer.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,16 @@ function convert (obj, key) {
129129
if ((keyPrefix === '$' || keyPrefix === '_') && key !== '$index') {
130130
return
131131
}
132-
var observer = obj.__observer__,
133-
val = obj[key],
134-
values = observer.values
135-
values[key] = val
136132
// emit set on bind
137133
// this means when an object is observed it will emit
138134
// a first batch of set events.
135+
var observer = obj.__observer__,
136+
values = observer.values,
137+
val = values[key] = obj[key]
139138
observer.emit('set', key, val)
139+
if (Array.isArray(val)) {
140+
observer.emit('set', key + '.length', val.length)
141+
}
140142
Object.defineProperty(obj, key, {
141143
get: function () {
142144
var value = values[key]

0 commit comments

Comments
 (0)