Skip to content

Commit 070d5c0

Browse files
committed
dom method callbacks should be async.
1 parent 837b2d6 commit 070d5c0

File tree

3 files changed

+55
-22
lines changed

3 files changed

+55
-22
lines changed

src/utils.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ var config = require('./config'),
55
console = window.console,
66
ViewModel // late def
77

8+
var defer =
9+
window.webkitRequestAnimationFrame ||
10+
window.requestAnimationFrame ||
11+
window.setTimeout
12+
813
/**
914
* Create a prototype-less object
1015
* which is a better hash/map
@@ -180,5 +185,12 @@ var utils = module.exports = {
180185
if (!config.silent && console) {
181186
console.warn(join.call(arguments, ' '))
182187
}
188+
},
189+
190+
/**
191+
* Defer DOM updates
192+
*/
193+
nextTick: function (cb) {
194+
defer(cb, 0)
183195
}
184196
}

src/viewmodel.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
var Compiler = require('./compiler'),
2-
def = require('./utils').defProtected,
3-
transition = require('./transition')
2+
utils = require('./utils'),
3+
transition = require('./transition'),
4+
def = utils.defProtected,
5+
nextTick = utils.nextTick
46

57
/**
68
* ViewModel exposed to the user that holds data,
@@ -102,7 +104,7 @@ def(VMProto, '$appendTo', function (target, cb) {
102104
var el = this.$el
103105
transition(el, 1, function () {
104106
target.appendChild(el)
105-
if (cb) cb()
107+
if (cb) nextTick(cb)
106108
}, this.$compiler)
107109
})
108110

@@ -112,7 +114,7 @@ def(VMProto, '$remove', function (cb) {
112114
if (!parent) return
113115
transition(el, -1, function () {
114116
parent.removeChild(el)
115-
if (cb) cb()
117+
if (cb) nextTick(cb)
116118
}, this.$compiler)
117119
})
118120

@@ -123,7 +125,7 @@ def(VMProto, '$before', function (target, cb) {
123125
if (!parent) return
124126
transition(el, 1, function () {
125127
parent.insertBefore(el, target)
126-
if (cb) cb()
128+
if (cb) nextTick(cb)
127129
}, this.$compiler)
128130
})
129131

@@ -139,7 +141,7 @@ def(VMProto, '$after', function (target, cb) {
139141
} else {
140142
parent.appendChild(el)
141143
}
142-
if (cb) cb()
144+
if (cb) nextTick(cb)
143145
}, this.$compiler)
144146
})
145147

test/unit/specs/viewmodel.js

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,8 @@ describe('UNIT: ViewModel', function () {
217217

218218
var enterCalled,
219219
leaveCalled,
220-
callbackCalled
220+
callbackCalled,
221+
nextTick = require('vue/src/utils').nextTick
221222

222223
var v = new Vue({
223224
attributes: {
@@ -247,16 +248,19 @@ describe('UNIT: ViewModel', function () {
247248
callbackCalled = true
248249
}
249250

250-
it('$appendTo', function () {
251+
it('$appendTo', function (done) {
251252
reset()
252253
var parent = document.createElement('div')
253254
v.$appendTo(parent, cb)
254255
assert.strictEqual(v.$el.parentNode, parent)
255256
assert.ok(enterCalled)
256-
assert.ok(callbackCalled)
257+
nextTick(function () {
258+
assert.ok(callbackCalled)
259+
done()
260+
})
257261
})
258262

259-
it('$before', function () {
263+
it('$before', function (done) {
260264
reset()
261265
var parent = document.createElement('div'),
262266
ref = document.createElement('div')
@@ -265,10 +269,13 @@ describe('UNIT: ViewModel', function () {
265269
assert.strictEqual(v.$el.parentNode, parent)
266270
assert.strictEqual(v.$el.nextSibling, ref)
267271
assert.ok(enterCalled)
268-
assert.ok(callbackCalled)
272+
nextTick(function () {
273+
assert.ok(callbackCalled)
274+
done()
275+
})
269276
})
270277

271-
it('$after', function () {
278+
it('$after', function (done) {
272279
reset()
273280
var parent = document.createElement('div'),
274281
ref1 = document.createElement('div'),
@@ -280,25 +287,37 @@ describe('UNIT: ViewModel', function () {
280287
assert.strictEqual(v.$el.nextSibling, ref2)
281288
assert.strictEqual(ref1.nextSibling, v.$el)
282289
assert.ok(enterCalled)
283-
assert.ok(callbackCalled)
284-
reset()
285-
v.$after(ref2, cb)
286-
assert.strictEqual(v.$el.parentNode, parent)
287-
assert.notOk(v.$el.nextSibling)
288-
assert.strictEqual(ref2.nextSibling, v.$el)
289-
assert.ok(enterCalled)
290-
assert.ok(callbackCalled)
290+
nextTick(function () {
291+
assert.ok(callbackCalled)
292+
next()
293+
})
294+
295+
function next () {
296+
reset()
297+
v.$after(ref2, cb)
298+
assert.strictEqual(v.$el.parentNode, parent)
299+
assert.notOk(v.$el.nextSibling)
300+
assert.strictEqual(ref2.nextSibling, v.$el)
301+
assert.ok(enterCalled)
302+
nextTick(function () {
303+
assert.ok(callbackCalled)
304+
done()
305+
})
306+
}
291307
})
292308

293-
it('$remove', function () {
309+
it('$remove', function (done) {
294310
reset()
295311
var parent = document.createElement('div')
296312
v.$appendTo(parent)
297313
v.$remove(cb)
298314
assert.notOk(v.$el.parentNode)
299315
assert.ok(enterCalled)
300316
assert.ok(leaveCalled)
301-
assert.ok(callbackCalled)
317+
nextTick(function () {
318+
assert.ok(callbackCalled)
319+
done()
320+
})
302321
})
303322

304323
})

0 commit comments

Comments
 (0)