Selaa lähdekoodia

:bug: Prevents Setting from registering a dependency (#4081)

Eric Kwoka 1 vuosi sitten
vanhempi
commit
28d1206001
2 muutettua tiedostoa jossa 31 lisäystä ja 5 poistoa
  1. 4 2
      packages/alpinejs/src/scope.js
  2. 27 3
      tests/cypress/integration/scope.spec.js

+ 4 - 2
packages/alpinejs/src/scope.js

@@ -48,6 +48,7 @@ let mergeProxyTrap = {
         if (name == Symbol.unscopables) return false;
 
         return objects.some((obj) =>
+            Object.prototype.hasOwnProperty.call(obj, name) ||
             Reflect.has(obj, name)
         );
     },
@@ -65,8 +66,9 @@ let mergeProxyTrap = {
     },
 
     set({ objects }, name, value, thisProxy) {
-        const target = objects.find((obj) =>
-               Reflect.has(obj, name)
+        const target =
+            objects.find((obj) =>
+                Object.prototype.hasOwnProperty.call(obj, name)
             ) || objects[objects.length - 1];
         const descriptor = Object.getOwnPropertyDescriptor(target, name);
         if (descriptor?.set && descriptor?.get)

+ 27 - 3
tests/cypress/integration/scope.spec.js

@@ -69,12 +69,16 @@ test(
                         this.value++;
                     }
                 }
-                document.addEventListener("alpine:init", () => 
+                document.addEventListener("alpine:init", () =>
                     Alpine.data("counter", () => new Counter())
-                )
+                );
             </script>
             <div x-data="counter">
-                <button type="button" @click="increment" x-text=value></button>
+                <button
+                    type="button"
+                    @click="increment"
+                    x-text="value"
+                ></button>
             </div>
         `,
     ],
@@ -85,3 +89,23 @@ test(
     }
 );
 
+test(
+    "setting value doesn't register a dependency",
+    [
+        html`
+            <div x-data="{ message: 'original' }">
+                <button
+                    x-effect="message = 'effected'"
+                    @click="message = 'clicked'"
+                    x-text="message"
+                ></button>
+            </div>
+            ;
+        `,
+    ],
+    ({ get }) => {
+        get("button").should(haveText("effected"));
+        get("button").click();
+        get("button").should(haveText("clicked"));
+    }
+);