alpine-scope.spec.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. let { morph } = require('@alpinejs/morph')
  2. let Alpine = require('alpinejs').default
  3. let createElement = require('./createElement.js')
  4. test('morphing an element with changed Alpine scope', () => {
  5. let template = `<div x-data="{ foo: 'bar' }">
  6. <button @click="foo = 'baz'">Change Foo</button>
  7. <span x-text="foo"></span>
  8. </div>`
  9. let dom = createElement(template)
  10. document.body.appendChild(dom)
  11. window.Alpine = Alpine
  12. window.Alpine.start()
  13. dom.querySelector('button').click()
  14. expect(dom.querySelector('span').textContent).toEqual('baz')
  15. morph(dom, template)
  16. expect(dom.querySelector('span').textContent).toEqual('baz')
  17. })
  18. test('morphing element with changed HTML AND Alpine scope', () => {
  19. let template = `<div x-data="{ foo: 'bar' }">
  20. <button @click="foo = 'baz'">Change Foo</button>
  21. <span x-text="foo"></span>
  22. </div>`
  23. let dom = createElement(template)
  24. document.body.appendChild(dom)
  25. window.Alpine = Alpine
  26. window.Alpine.start()
  27. dom.querySelector('button').click()
  28. expect(dom.querySelector('span').textContent).toEqual('baz')
  29. expect(dom.querySelector('button').textContent).toEqual('Change Foo')
  30. morph(dom, template.replace('Change Foo', 'Changed Foo'))
  31. expect(dom.querySelector('span').textContent).toEqual('baz')
  32. expect(dom.querySelector('button').textContent).toEqual('Changed Foo')
  33. })
  34. test('morphing an element with multiple nested Alpine components preserves scope', () => {
  35. let template = `<div x-data="{ foo: 'bar' }">
  36. <button @click="foo = 'baz'">Change Foo</button>
  37. <span x-text="foo"></span>
  38. <div x-data="{ bob: 'lob' }">
  39. <a href="#" @click.prevent="bob = 'law'">Change Bob</a>
  40. <h1 x-text="bob"></h1>
  41. </div>
  42. </div>`
  43. let dom = createElement(template)
  44. document.body.appendChild(dom)
  45. window.Alpine = Alpine
  46. window.Alpine.start()
  47. dom.querySelector('button').click()
  48. dom.querySelector('a').click()
  49. expect(dom.querySelector('span').textContent).toEqual('baz')
  50. expect(dom.querySelector('h1').textContent).toEqual('law')
  51. morph(dom, template)
  52. expect(dom.querySelector('span').textContent).toEqual('baz')
  53. expect(dom.querySelector('h1').textContent).toEqual('law')
  54. })
  55. test('morphing an alpine component with static javascript re-evaluates', () => {
  56. window.count = 1
  57. let template = `<div x-data>
  58. <span x-text="window.count"></span>
  59. </div>`
  60. let dom = createElement(template)
  61. document.body.appendChild(dom)
  62. window.Alpine = Alpine
  63. window.Alpine.start()
  64. expect(dom.querySelector('span').textContent).toEqual('1')
  65. window.count++
  66. morph(dom, template)
  67. expect(dom.querySelector('span').textContent).toEqual('2')
  68. })