Jelajahi Sumber

Merge pull request #106 from ryangjchandler/fix/regression-watchers

fix(watchers): not running on reset and thereafter
Ryan Chandler 4 tahun lalu
induk
melakukan
2e5073be27

File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.module.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.module.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.umd.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/spruce.umd.js.map


+ 26 - 0
examples/watchers-reset.html

@@ -0,0 +1,26 @@
+<html>
+    <head>
+        <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.js" defer></script>
+    </head>
+    <body x-data>
+        <button>Reset store</button>
+
+        <template x-for="item in $store.todo">
+            <p x-text="item"></p>
+        </template>
+
+        <script src="/dist/spruce.umd.js"></script>
+
+        <script>
+            Spruce.store('todo', [])
+
+            Spruce.watch('todo', value => {
+                console.log(`Todo updated: ${value}.`)
+            })
+
+            document.querySelector('button').addEventListener('click', e => {
+                Spruce.reset('todo', [])
+            })
+        </script>
+    </body>
+</html>

+ 12 - 1
src/index.js

@@ -114,6 +114,17 @@ const Spruce = {
     },
 
     reset(name, state) {
+        // This line is needed to ensure any watchers on
+        // the store itself are run when reset.
+        this.runWatchers(this.stores[name], '__self', state)
+
+        // This conditional will take any existing watchers on
+        // the store being reset and apply them back to the new
+        // state (see issue #105).
+        if (! state['__watchers']) {
+            state['__watchers'] = this.stores[name].__watchers
+        }
+        
         this.stores[name] = state
     },
 
@@ -231,7 +242,7 @@ const Spruce = {
             return
         }
 
-        if (target.__watchers.has(key)) {
+        if (target.__watchers.has(key) && key !== '__self') {
             target.__watchers.get(key).forEach(f => f(value))
         }
 

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini