misc_spec.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 attach/ready/detach hook 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. template: '<div><test></test><test></test></div>',
  93. components: {
  94. test: {
  95. template: '<span>hi</span>',
  96. attached: log(3),
  97. ready: log(4),
  98. detached: log(5)
  99. }
  100. }
  101. })
  102. expect(vm.$el.innerHTML).toBe('<span>hi</span><span>hi</span>')
  103. expect(logs.join()).toBe('0,3,4,3,4,1')
  104. logs = []
  105. vm.$destroy(true)
  106. expect(logs.join()).toBe('2,5,5')
  107. Vue.options.replace = false
  108. })
  109. })