x-modelable.spec.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { haveText, html, test } from '../../utils'
  2. test('can expose data for x-model binding',
  3. html`
  4. <div x-data="{ outer: 'foo' }">
  5. <div x-data="{ inner: 'bar' }" x-modelable="inner" x-model="outer">
  6. <h1 x-text="outer"></h1>
  7. <h2 x-text="inner"></h2>
  8. <button @click="inner = 'bob'" id="1">change inner</button>
  9. <button @click="outer = 'lob'" id="2">change outer</button>
  10. </div>
  11. </div>
  12. `,
  13. ({ get }) => {
  14. get('h1').should(haveText('foo'))
  15. get('h2').should(haveText('foo'))
  16. get('#1').click()
  17. get('h1').should(haveText('bob'))
  18. get('h2').should(haveText('bob'))
  19. get('#2').click()
  20. get('h1').should(haveText('lob'))
  21. get('h2').should(haveText('lob'))
  22. }
  23. )
  24. test('Something like Livewire can hook into x-modelable',
  25. html`
  26. <h1 x-data="{ value: 'bar' }" x-modelable="value" x-init="
  27. () => {}; $el._x_modelable_hook = (val) => {
  28. return val.toUpperCase()
  29. }
  30. ">
  31. <span x-text="value"></span>
  32. </h1>
  33. `,
  34. ({ get }) => {
  35. get('span').should(haveText('BAR'))
  36. }
  37. )
  38. test('x-modelable works when inside x-bind and x-model is outside',
  39. html`
  40. <div x-data="{ outer: 'foo', thing: {
  41. ['x-modelable']: 'inner',
  42. } }">
  43. <div x-data="{ inner: 'bar' }" x-bind="thing" x-model="outer">
  44. <h1 x-text="outer"></h1>
  45. <h2 x-text="inner"></h2>
  46. <button @click="inner = 'bob'" id="1">change inner</button>
  47. <button @click="outer = 'lob'" id="2">change outer</button>
  48. </div>
  49. </div>
  50. `,
  51. ({ get }) => {
  52. get('h1').should(haveText('foo'))
  53. get('h2').should(haveText('foo'))
  54. get('#1').click()
  55. get('h1').should(haveText('bob'))
  56. get('h2').should(haveText('bob'))
  57. get('#2').click()
  58. get('h1').should(haveText('lob'))
  59. get('h2').should(haveText('lob'))
  60. }
  61. )
  62. test('x-modelable removes the event listener used by corresponding x-model',
  63. html`
  64. <div x-data="{ outer: 'foo' }">
  65. <div x-data="{ inner: 'bar' }" x-modelable="inner" x-model="outer">
  66. <h1 x-text="outer"></h1>
  67. <h2 x-text="inner"></h2>
  68. <button id="1" @click="$dispatch('input', 'baz')"></button>
  69. </div>
  70. </div>
  71. `,
  72. ({ get }) => {
  73. get('h1').should(haveText('foo'))
  74. get('h2').should(haveText('foo'))
  75. get('#1').click()
  76. get('h1').should(haveText('foo'))
  77. get('h2').should(haveText('foo'))
  78. }
  79. )
  80. test('can have a named x-modelable',
  81. html`
  82. <div x-data="{ outer: 'foo' }">
  83. <div x-data="{ inner: 'bar' }" x-modelable:custom="inner" x-model:custom="outer">
  84. <h1 x-text="outer"></h1>
  85. <h2 x-text="inner"></h2>
  86. <button @click="inner = 'bob'" id="1">change inner</button>
  87. <button @click="outer = 'lob'" id="2">change outer</button>
  88. </div>
  89. </div>
  90. `,
  91. ({ get }) => {
  92. get('h1').should(haveText('foo'))
  93. get('h2').should(haveText('foo'))
  94. get('#1').click()
  95. get('h1').should(haveText('bob'))
  96. get('h2').should(haveText('bob'))
  97. get('#2').click()
  98. get('h1').should(haveText('lob'))
  99. get('h2').should(haveText('lob'))
  100. }
  101. )