Quellcode durchsuchen

feat(pass old value to watcher callback)

Ryan Chandler vor 5 Jahren
Ursprung
Commit
1b20e47571
11 geänderte Dateien mit 16 neuen und 7 gelöschten Zeilen
  1. 4 0
      README.md
  2. 0 0
      dist/spruce.js
  3. 0 0
      dist/spruce.js.map
  4. 0 0
      dist/spruce.module.js
  5. 0 0
      dist/spruce.module.js.map
  6. 0 0
      dist/spruce.umd.js
  7. 0 0
      dist/spruce.umd.js.map
  8. 3 3
      src/bus.js
  9. 2 2
      src/index.js
  10. 3 1
      src/observable.js
  11. 4 1
      tests/bus.spec.js

+ 4 - 0
README.md

@@ -123,6 +123,10 @@ Spruce.stores.application.name = 'Amazing Spruce Integration'
 
 This will trigger Alpine to re-evaluate your subscribed components and re-render.
 
+### Externally watching for changes
+
+You can register watchers in a similar fashion to Alpine. All you need is the full dot-notation representation of your piece of state and a callback.
+
 ### Removing the need for `x-subscribe`
 
 Alpine offers a Config API. Using this API, you can enable an experimental global `$store` variable that is declared on the `window` object. This means your components do not need to manually "subscribe" to state changes:

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.module.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.module.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.umd.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/spruce.umd.js.map


+ 3 - 3
src/bus.js

@@ -34,11 +34,11 @@ export default {
         this.watchers[dotNotation].push(callback)
     },
 
-    runWatchers(stores, target, key) {
+    runWatchers(stores, target, key, oldValue) {
         const self = this
 
         if (self.watchers[key]) {
-            return self.watchers[key].forEach(callback => callback(target[key]))
+            return self.watchers[key].forEach(callback => callback(oldValue, target[key]))
         }
 
         Object.keys(self.watchers)
@@ -50,7 +50,7 @@ export default {
 
                 dotNotationParts.reduce((comparison, part) => {
                     if (comparison[key] === target[key] || Object.is(target, comparison)) {
-                        self.watchers[fullDotNotationKey].forEach(callback => callback(target[key]))
+                        self.watchers[fullDotNotationKey].forEach(callback => callback(oldValue, target[key]))
                     }
 
                     return comparison[part]

+ 2 - 2
src/index.js

@@ -22,8 +22,8 @@ const Spruce = {
         })
 
         this.stores = createObservable(this.stores, {
-            set: (target, key, value) => {
-                this.events.runWatchers(this.stores, target, key)
+            set: (target, key, value, oldValue) => {
+                this.events.runWatchers(this.stores, target, key, oldValue)
 
                 this.updateSubscribers(key, value)
             }

+ 3 - 1
src/observable.js

@@ -16,11 +16,13 @@ export const createObservable = (target, callbacks) => {
             return target[key]
         },
         set(target, key, value) {
+            const old = target[key]
+
             if (! isNullOrUndefined(value) && typeof value === 'object') {
                 value = createObservable(value, callbacks)
             }
 
-            callbacks.set(target, key, target[key] = value)
+            callbacks.set(target, key, target[key] = value, old)
 
             return true
         }

+ 4 - 1
tests/bus.spec.js

@@ -68,12 +68,14 @@ test('.emit() > will dispatch browser event to window with spruce: prefix', asyn
 
 test('.watch() > can listen for changes to property', async () => {
     let fixture = undefined
+    let oldFixture = undefined
     
     Spruce.store('example', {
         cool: 'stuff'
     })
 
-    Spruce.watch('example.cool', (value) => {
+    Spruce.watch('example.cool', (previous, value) => {
+        oldFixture = previous
         fixture = value
     })
 
@@ -84,4 +86,5 @@ test('.watch() > can listen for changes to property', async () => {
     Spruce.stores.example.cool = 'amazing'
 
     expect(fixture).toEqual('amazing')
+    expect(oldFixture).toEqual('stuff')
 })

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.