Caleb Porzio 5 éve
szülő
commit
f537f27153
6 módosított fájl, 57 hozzáadás és 13 törlés
  1. 1 1
      dist/mix-manifest.json
  2. 18 5
      dist/project-x.js
  3. 8 1
      index.html
  4. 7 0
      src/component.js
  5. 16 0
      test/model.spec.js
  6. 7 6
      test/on.spec.js

+ 1 - 1
dist/mix-manifest.json

@@ -1,4 +1,4 @@
 {
 {
-    "/project-x.js": "/project-x.js?id=956c347a4c443cc9eabd",
+    "/project-x.js": "/project-x.js?id=b1f0f893df2af0b6f35c",
     "/project-x.min.js": "/project-x.min.js?id=594fb2ceb5a9311a8dfb"
     "/project-x.min.js": "/project-x.min.js?id=594fb2ceb5a9311a8dfb"
 }
 }

+ 18 - 5
dist/project-x.js

@@ -958,9 +958,7 @@ function () {
               expression = _ref2.expression;
               expression = _ref2.expression;
 
 
           switch (type) {
           switch (type) {
-            case 'bind':
-              var attrName = value;
-
+            case 'model':
               var _self$evaluateReturnE = self.evaluateReturnExpression(expression),
               var _self$evaluateReturnE = self.evaluateReturnExpression(expression),
                   output = _self$evaluateReturnE.output,
                   output = _self$evaluateReturnE.output,
                   deps = _self$evaluateReturnE.deps;
                   deps = _self$evaluateReturnE.deps;
@@ -968,16 +966,31 @@ function () {
               if (self.concernedData.filter(function (i) {
               if (self.concernedData.filter(function (i) {
                 return deps.includes(i);
                 return deps.includes(i);
               }).length > 0) {
               }).length > 0) {
-                self.updateAttributeValue(el, attrName, output);
+                self.updateAttributeValue(el, 'value', output);
               }
               }
 
 
               break;
               break;
 
 
-            case 'text':
+            case 'bind':
+              var attrName = value;
+
               var _self$evaluateReturnE2 = self.evaluateReturnExpression(expression),
               var _self$evaluateReturnE2 = self.evaluateReturnExpression(expression),
                   output = _self$evaluateReturnE2.output,
                   output = _self$evaluateReturnE2.output,
                   deps = _self$evaluateReturnE2.deps;
                   deps = _self$evaluateReturnE2.deps;
 
 
+              if (self.concernedData.filter(function (i) {
+                return deps.includes(i);
+              }).length > 0) {
+                self.updateAttributeValue(el, attrName, output);
+              }
+
+              break;
+
+            case 'text':
+              var _self$evaluateReturnE3 = self.evaluateReturnExpression(expression),
+                  output = _self$evaluateReturnE3.output,
+                  deps = _self$evaluateReturnE3.deps;
+
               if (self.concernedData.filter(function (i) {
               if (self.concernedData.filter(function (i) {
                 return deps.includes(i);
                 return deps.includes(i);
               }).length > 0) {
               }).length > 0) {

+ 8 - 1
index.html

@@ -5,11 +5,18 @@
         </style>
         </style>
 
 
         <script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js" integrity="sha256-iM4Yzi/zLj/IshPWMC1IluRxTtRjMqjPGd97TZ9yYpU=" crossorigin="anonymous"></script>
         <script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js" integrity="sha256-iM4Yzi/zLj/IshPWMC1IluRxTtRjMqjPGd97TZ9yYpU=" crossorigin="anonymous"></script>
-        <script src="/dist/project-x.min.js"></script>
+        <script src="/dist/project-x.js"></script>
     </head>
     </head>
     <body>
     <body>
         <a href="/link-target">turbo-page</a>
         <a href="/link-target">turbo-page</a>
 
 
+
+        <div x-data="{ foo: 'bar' }">
+            <input x-model="foo"></input>
+
+            <button x-on:click="foo = 'baz'"></button>
+        </div>
+
         <div x-data="{ open: false }">
         <div x-data="{ open: false }">
             <button x-on:click="open = true">Open Dropdown</button>
             <button x-on:click="open = true">Open Dropdown</button>
 
 

+ 7 - 0
src/component.js

@@ -60,6 +60,13 @@ export default class Component {
         debounce(walk, 5)(this.el, function (el) {
         debounce(walk, 5)(this.el, function (el) {
             getXAttrs(el).forEach(({ type, value, modifiers, expression }) => {
             getXAttrs(el).forEach(({ type, value, modifiers, expression }) => {
                 switch (type) {
                 switch (type) {
+                    case 'model':
+                        var { output, deps } = self.evaluateReturnExpression(expression)
+
+                        if (self.concernedData.filter(i => deps.includes(i)).length > 0) {
+                            self.updateAttributeValue(el, 'value', output)
+                        }
+                        break;
                     case 'bind':
                     case 'bind':
                         const attrName = value
                         const attrName = value
                         var { output, deps } = self.evaluateReturnExpression(expression)
                         var { output, deps } = self.evaluateReturnExpression(expression)

+ 16 - 0
test/model.spec.js

@@ -31,6 +31,22 @@ test('x-model updates value when updated via input event', async () => {
     await wait(() => { expect(document.querySelector('input').value).toEqual('baz') })
     await wait(() => { expect(document.querySelector('input').value).toEqual('baz') })
 })
 })
 
 
+test('x-model reflects data changed elsewhere', async () => {
+    document.body.innerHTML = `
+        <div x-data="{ foo: 'bar' }">
+            <input x-model="foo"></input>
+
+            <button x-on:click="foo = 'baz'"></button>
+        </div>
+    `
+
+    projectX.start()
+
+    document.querySelector('button').click()
+
+    await wait(() => { expect(document.querySelector('input').value).toEqual('baz') })
+})
+
 test('x-model casts value to number if number modifier is present', async () => {
 test('x-model casts value to number if number modifier is present', async () => {
     document.body.innerHTML = `
     document.body.innerHTML = `
         <div x-data="{ foo: null }">
         <div x-data="{ foo: null }">

+ 7 - 6
test/on.spec.js

@@ -56,11 +56,12 @@ test('data modified in event listener doesnt update uneffected attribute binding
 
 
 test('click away', async () => {
 test('click away', async () => {
     document.body.innerHTML = `
     document.body.innerHTML = `
+        <style>.hidden { display: none; }</style>
         <div id="outer">
         <div id="outer">
             <div x-data="{ isOpen: true }">
             <div x-data="{ isOpen: true }">
                 <button x-on:click="isOpen = true"></button>
                 <button x-on:click="isOpen = true"></button>
 
 
-                <ul x-bind:value="isOpen" x-on:click.away="isOpen = false">
+                <ul x-bind:class="{ 'hidden': ! isOpen }" x-on:click.away="isOpen = false">
                     <li>...</li>
                     <li>...</li>
                 </ul>
                 </ul>
             </div>
             </div>
@@ -69,21 +70,21 @@ test('click away', async () => {
 
 
     projectX.start()
     projectX.start()
 
 
-    expect(document.querySelector('ul').getAttribute('value')).toEqual('true')
+    expect(document.querySelector('ul').classList.contains('hidden')).toEqual(false)
 
 
     document.querySelector('li').click()
     document.querySelector('li').click()
 
 
-    await wait(() => { expect(document.querySelector('ul').getAttribute('value')).toEqual('true') })
+    await wait(() => { expect(document.querySelector('ul').classList.contains('hidden')).toEqual(false) })
 
 
     document.querySelector('ul').click()
     document.querySelector('ul').click()
 
 
-    await wait(() => { expect(document.querySelector('ul').getAttribute('value')).toEqual('true') })
+    await wait(() => { expect(document.querySelector('ul').classList.contains('hidden')).toEqual(false) })
 
 
     document.querySelector('#outer').click()
     document.querySelector('#outer').click()
 
 
-    await wait(() => { expect(document.querySelector('ul').getAttribute('value')).toEqual('false') })
+    await wait(() => { expect(document.querySelector('ul').classList.contains('hidden')).toEqual(true) })
 
 
     document.querySelector('button').click()
     document.querySelector('button').click()
 
 
-    await wait(() => { expect(document.querySelector('ul').getAttribute('value')).toEqual('true') })
+    await wait(() => { expect(document.querySelector('ul').classList.contains('hidden')).toEqual(false) })
 })
 })