Skip to content

Commit

Permalink
* [jsfm] fixed repeat bug when update values with new object references
Browse files Browse the repository at this point in the history
  • Loading branch information
Jinjiang committed Jul 17, 2016
1 parent ada739f commit 371e58c
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 0 deletions.
6 changes: 6 additions & 0 deletions html5/default/vm/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,12 @@ function bindRepeat (vm, target, fragBlock, info) {
}
children.push(reused.target)
vms.push(reused.vm)
if (oldStyle) {
reused.vm = item
}
else {
reused.vm[valueName] = item
}
reused.vm[keyName] = index
fragBlock.updateMark = reused.target
}
Expand Down
117 changes: 117 additions & 0 deletions html5/test/unit/default/vm/vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,123 @@ describe('generate virtual dom for a single vm', () => {
expect(el.children[6].attr).eql({ src: 2 })
})

it('generate more than one group of elements with the same repeat data', () => {
customComponentMap.foo = {
template: {
type: 'container',
children: [
{ type: 'begin' },
{
repeat: {
expression: function () { return this.list },
value: 'v1'
},
type: 'image', attr: { src: function () { return this.v1.x } }
},
{ type: 'middle' },
{
repeat: {
expression: function () { return this.list },
value: 'v2'
},
type: 'text', attr: { value: function () { return this.v2.x } }
},
{ type: 'end' }
]
},
data: {
list: [
{ uid: 1, x: 1 }, { uid: 2, x: 2 }, { uid: 3 }
]
}
}

const app = { doc, customComponentMap, differ }
const vm = new Vm('foo', customComponentMap.foo, { _app: app })

expect(vm._app).equal(app)
expect(vm.list).eql([
{ uid: 1, x: 1 },
{ uid: 2, x: 2 },
{ uid: 3 }])

const el = doc.body
expect(el.type).eql('container')
expect(el.children).is.an.array

// [begin, comment, image x 3, comment, middle, comment, text x 3, comment, end]
expect(el.children.length).eql(13)

expect(el.children[0].type).eql('begin')
expect(el.children[1].type).eql('comment')
expect(el.children[1].value).eql('start')
expect(el.children[2].type).eql('image')
expect(el.children[2].attr).eql({ src: 1 })
expect(el.children[3].type).eql('image')
expect(el.children[3].attr).eql({ src: 2 })
expect(el.children[4].type).eql('image')
expect(el.children[4].attr).eql({})
expect(el.children[5].type).eql('comment')
expect(el.children[5].value).eql('end')
expect(el.children[6].type).eql('middle')
expect(el.children[7].type).eql('comment')
expect(el.children[7].value).eql('start')
expect(el.children[8].type).eql('text')
expect(el.children[8].attr).eql({ value: 1 })
expect(el.children[9].type).eql('text')
expect(el.children[9].attr).eql({ value: 2 })
expect(el.children[10].type).eql('text')
expect(el.children[10].attr).eql({})
expect(el.children[11].type).eql('comment')
expect(el.children[11].value).eql('end')
expect(el.children[12].type).eql('end')

vm.list[0].x = 4
differ.flush()

expect(el.children.length).eql(13)
expect(el.children[2].attr).eql({ src: 4 })
expect(el.children[8].attr).eql({ value: 4 })

// [begin, comment, image x 4, comment, middle, comment, text x 4, comment, end]
vm.list.push({ uid: 10, x: 10 })
differ.flush()

expect(el.children.length).eql(15)
expect(el.children[5].attr).eql({ src: 10 })
expect(el.children[12].attr).eql({ value: 10 })

// [begin, comment, image x 2, comment, middle, comment, text x 2, comment, end]
vm.list = [
{ uid: 100, x: 100 }, { uid: 1, x: 1 }
]
differ.flush()

expect(el.children.length).eql(11)
expect(el.children[2].attr).eql({ src: 100 })
expect(el.children[3].attr).eql({ src: 1 })
expect(el.children[7].attr).eql({ value: 100 })
expect(el.children[8].attr).eql({ value: 1 })

vm.list[0].x = 4
differ.flush()

expect(el.children.length).eql(11)
expect(el.children[2].attr).eql({ src: 4 })
expect(el.children[3].attr).eql({ src: 1 })
expect(el.children[7].attr).eql({ value: 4 })
expect(el.children[8].attr).eql({ value: 1 })

vm.list[1].x = 5
differ.flush()

expect(el.children.length).eql(11)
expect(el.children[2].attr).eql({ src: 4 })
expect(el.children[3].attr).eql({ src: 5 })
expect(el.children[7].attr).eql({ value: 4 })
expect(el.children[8].attr).eql({ value: 5 })
})

it('generate an element with external data', () => {
customComponentMap.foo = {
data: () => {
Expand Down

0 comments on commit 371e58c

Please sign in to comment.