| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- var _ = require('../../../../src/util')
- var Vue = require('../../../../src/vue')
- if (_.inBrowser) {
- describe('v-component', function () {
- var el
- beforeEach(function () {
- el = document.createElement('div')
- spyOn(_, 'warn')
- })
- it('static', function () {
- var vm = new Vue({
- el: el,
- template: '<div v-component="test"></div>',
- components: {
- test: {
- data: function () {
- return { a: 123 }
- },
- template: '{{a}}'
- }
- }
- })
- expect(el.innerHTML).toBe('<div>123</div><!--v-component-->')
- })
- it('replace', function () {
- var vm = new Vue({
- el: el,
- template: '<div v-component="test"></div>',
- components: {
- test: {
- replace: true,
- data: function () {
- return { a: 123 }
- },
- template: '<p>{{a}}</p>'
- }
- }
- })
- expect(el.innerHTML).toBe('<p>123</p><!--v-component-->')
- })
- it('block replace', function () {
- var vm = new Vue({
- el: el,
- template: '<div v-component="test"></div>',
- components: {
- test: {
- replace: true,
- data: function () {
- return { a: 123, b: 234 }
- },
- template: '<p>{{a}}</p><p>{{b}}</p>'
- }
- }
- })
- expect(el.innerHTML).toBe('<p>123</p><p>234</p><!--v-component-->')
- })
- it('dynamic', function (done) {
- var vm = new Vue({
- el: el,
- template: '<div v-component="{{view}}" v-attr="view:view"></div>',
- data: {
- view: 'a'
- },
- components: {
- a: {
- template: 'AAA',
- data: function () {
- return { view: 'a' }
- }
- },
- b: {
- template: 'BBB',
- data: function () {
- return { view: 'b' }
- }
- }
- }
- })
- expect(el.innerHTML).toBe('<div view="a">AAA</div><!--v-component-->')
- vm.view = 'b'
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div view="b">BBB</div><!--v-component-->')
- done()
- })
- })
- it('static v-if', function (done) {
- var vm = new Vue({
- el: el,
- data: { ok: false },
- template: '<div v-component="test" v-if="ok"></div>',
- components: {
- test: {
- data: function () {
- return { a: 123 }
- },
- template: '{{a}}'
- }
- }
- })
- expect(el.innerHTML).toBe('<!--v-component-->')
- expect(vm._children).toBeNull()
- vm.ok = true
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>123</div><!--v-component-->')
- expect(vm._children.length).toBe(1)
- vm.ok = false
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<!--v-component-->')
- expect(vm._children.length).toBe(0)
- done()
- })
- })
- })
- it('dynamic v-if', function (done) {
- var vm = new Vue({
- el: el,
- data: {
- ok: false,
- view: 'a'
- },
- template: '<div v-component="{{view}}" v-if="ok"></div>',
- components: {
- a: {
- template: 'AAA'
- },
- b: {
- template: 'BBB'
- }
- }
- })
- expect(el.innerHTML).toBe('<!--v-component-->')
- expect(vm._children).toBeNull()
- // toggle if with lazy instantiation
- vm.ok = true
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>AAA</div><!--v-component-->')
- expect(vm._children.length).toBe(1)
- // switch view when if=true
- vm.view = 'b'
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>BBB</div><!--v-component-->')
- expect(vm._children.length).toBe(1)
- // toggle if when already instantiated
- vm.ok = false
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<!--v-component-->')
- expect(vm._children.length).toBe(0)
- // toggle if and switch view at the same time
- vm.view = 'a'
- vm.ok = true
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>AAA</div><!--v-component-->')
- expect(vm._children.length).toBe(1)
- done()
- })
- })
- })
- })
- })
- it('keep-alive', function (done) {
- var spyA = jasmine.createSpy()
- var spyB = jasmine.createSpy()
- var vm = new Vue({
- el: el,
- template: '<div v-component="{{view}}" keep-alive></div>',
- data: {
- view: 'a'
- },
- components: {
- a: {
- created: spyA,
- template: 'AAA'
- },
- b: {
- created: spyB,
- template: 'BBB'
- }
- }
- })
- expect(el.innerHTML).toBe('<div>AAA</div><!--v-component-->')
- expect(spyA.calls.count()).toBe(1)
- expect(spyB.calls.count()).toBe(0)
- vm.view = 'b'
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>BBB</div><!--v-component-->')
- expect(spyA.calls.count()).toBe(1)
- expect(spyB.calls.count()).toBe(1)
- vm.view = 'a'
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>AAA</div><!--v-component-->')
- expect(spyA.calls.count()).toBe(1)
- expect(spyB.calls.count()).toBe(1)
- vm.view = 'b'
- _.nextTick(function () {
- expect(el.innerHTML).toBe('<div>BBB</div><!--v-component-->')
- expect(spyA.calls.count()).toBe(1)
- expect(spyB.calls.count()).toBe(1)
- done()
- })
- })
- })
- })
- it('teardown', function () {
- var vm = new Vue({
- el: el,
- data: { ok: true },
- template: '<div v-component="test" v-if="ok"></div>',
- components: {
- test: {}
- }
- })
- var child = vm._children[0]
- vm._directives[0].unbind()
- expect(vm._children.length).toBe(0)
- expect(child._isDestroyed).toBe(true)
- })
- it('already mounted warn', function () {
- el.setAttribute('v-component', 'test')
- var vm = new Vue({
- el: el
- })
- expect(_.warn).toHaveBeenCalled()
- })
- })
- }
|