Skip to content

Commit 3d95245

Browse files
committed
fix #835 v-repeat on root node with replace:true
1 parent 30bd8be commit 3d95245

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/compiler/transclude.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var _ = require('../util')
2+
var config = require('../config')
23
var templateParser = require('../parsers/template')
34
var transcludedFlagAttr = '__vue__transcluded'
45

@@ -73,7 +74,13 @@ function transcludeTemplate (el, options) {
7374
} else {
7475
var rawContent = options._content || _.extractContent(el)
7576
if (options.replace) {
76-
if (frag.childNodes.length > 1) {
77+
if (
78+
frag.childNodes.length > 1 ||
79+
// when root node has v-repeat, the instance ends up
80+
// having multiple top-level nodes, thus becoming a
81+
// block instance. (#835)
82+
frag.firstChild.hasAttribute(config.prefix + 'repeat')
83+
) {
7784
transcludeContent(frag, rawContent)
7885
return frag
7986
} else {

test/unit/specs/misc_spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,26 @@ describe('Misc', function () {
4747
expect(spy2).toHaveBeenCalled()
4848
})
4949

50+
it('v-repeat on component root node with replace:true', function () {
51+
var el = document.createElement('div')
52+
var vm = new Vue({
53+
el: el,
54+
template: '<div v-component="test"></div>',
55+
components: {
56+
test: {
57+
data: function () {
58+
return { list: [1, 2, 3] }
59+
},
60+
template: '<div v-repeat="list">{{$value}}</div>',
61+
replace: true
62+
}
63+
}
64+
})
65+
expect(vm.$el.innerHTML).toBe(
66+
'<!--v-start-->' +
67+
'<div>1</div><div>2</div><div>3</div><!--v-repeat-->' +
68+
'<!--v-end--><!--v-component-->'
69+
)
70+
})
71+
5072
})

0 commit comments

Comments
 (0)