misc_spec.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // test cases for edge cases & bug fixes
  2. var Vue = require('../../../src/vue')
  3. describe('Misc', function () {
  4. it('should handle directive.bind() altering its childNode structure', function () {
  5. var vm = new Vue({
  6. el: document.createElement('div'),
  7. template: '<div v-test>{{test}}</div>',
  8. data: {
  9. test: 'hi'
  10. },
  11. directives: {
  12. test: {
  13. bind: function () {
  14. this.el.insertBefore(document.createTextNode('yo '),
  15. this.el.firstChild)
  16. }
  17. }
  18. }
  19. })
  20. expect(vm.$el.textContent).toBe('yo hi')
  21. })
  22. it('attached/detached hooks for transcluded components', function () {
  23. var spy1 = jasmine.createSpy('attached')
  24. var spy2 = jasmine.createSpy('detached')
  25. var el = document.createElement('div')
  26. el.innerHTML = '<outer v-ref="outter"><inner></inner></outer>'
  27. document.body.appendChild(el)
  28. var vm = new Vue({
  29. el: el,
  30. components: {
  31. outer: {
  32. template: '<content></content>'
  33. },
  34. inner: {
  35. template: 'hi',
  36. attached: spy1,
  37. detached: spy2
  38. }
  39. }
  40. })
  41. expect(spy1).toHaveBeenCalled()
  42. vm.$.outter.$remove()
  43. expect(spy2).toHaveBeenCalled()
  44. })
  45. it('v-repeat on component root node with replace:true', function () {
  46. var el = document.createElement('div')
  47. var vm = new Vue({
  48. el: el,
  49. template: '<test></test>',
  50. components: {
  51. test: {
  52. data: function () {
  53. return { list: [1, 2, 3] }
  54. },
  55. template: '<div v-repeat="list">{{$value}}</div>',
  56. replace: true
  57. }
  58. }
  59. })
  60. expect(vm.$el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div>')
  61. })
  62. // #922
  63. it('template repeat inside svg', function () {
  64. var el = document.createElement('div')
  65. new Vue({
  66. el: el,
  67. template: '<svg><template v-repeat="list"><text>{{$value}}</text></template></svg>',
  68. data: {
  69. list: [1, 2, 3]
  70. }
  71. })
  72. // IE inlines svg namespace
  73. var xmlns = /\s?xmlns=".*svg"/
  74. expect(el.innerHTML.replace(xmlns, '')).toBe('<svg><text>1</text><text>2</text><text>3</text></svg>')
  75. })
  76. // #1005
  77. it('call lifecycle hooks for child components', function () {
  78. Vue.options.replace = true
  79. var el = document.createElement('div')
  80. var logs = []
  81. function log (n) {
  82. return function () {
  83. logs.push(n)
  84. }
  85. }
  86. document.body.appendChild(el)
  87. var vm = new Vue({
  88. el: el,
  89. attached: log(0),
  90. ready: log(1),
  91. detached: log(2),
  92. beforeDestroy: log(3),
  93. destroyed: log(4),
  94. template: '<div><test></test><test></test></div>',
  95. components: {
  96. test: {
  97. template: '<span>hi</span>',
  98. attached: log(5),
  99. ready: log(6),
  100. detached: log(7),
  101. beforeDestroy: log(8),
  102. destroyed: log(9)
  103. }
  104. }
  105. })
  106. expect(vm.$el.innerHTML).toBe('<span>hi</span><span>hi</span>')
  107. expect(logs.join()).toBe('0,5,6,5,6,1')
  108. logs = []
  109. vm.$destroy(true)
  110. expect(logs.join()).toBe('3,8,9,8,9,2,7,7,4')
  111. Vue.options.replace = false
  112. })
  113. // #1006
  114. it('destroyed hook for components inside v-if', function (done) {
  115. var spy = jasmine.createSpy('v-if destroyed hook')
  116. var vm = new Vue({
  117. el: document.createElement('div'),
  118. template: '<template v-if="ok"><test></test></template>',
  119. data: {
  120. ok: true
  121. },
  122. components: {
  123. test: {
  124. destroyed: spy
  125. }
  126. }
  127. })
  128. vm.ok = false
  129. Vue.nextTick(function () {
  130. expect(spy).toHaveBeenCalled()
  131. done()
  132. })
  133. })
  134. })