Ryan Chandler 5 жил өмнө
parent
commit
1bee5aeb97

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.js.map


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.module.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.module.js.map


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.umd.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
dist/spruce.umd.js.map


+ 30 - 0
src/bus.js

@@ -1,4 +1,6 @@
 export default {
+    watchers: {},
+
     events: {},
 
     on(name, callback) {
@@ -22,5 +24,33 @@ export default {
             detail: data,
             bubbles: true
         }))
+    },
+
+    watch(dotNotation, callback) {
+        if (! this.watchers[dotNotation]) {
+            this.watchers[dotNotation] = []
+        }
+
+        this.watchers[dotNotation].push(callback)
+    },
+
+    runWatchers(stores, target, key) {
+        const self = this
+
+        Object.keys(self.watchers)
+            .filter(watcher => watcher.includes('.'))
+            .forEach(fullDotNotationKey => {
+                let dotNotationParts = fullDotNotationKey.split('.')
+
+                if (key !== dotNotationParts[dotNotationParts.length - 1]) return
+
+                dotNotationParts.reduce((comparison, part) => {
+                    if (Object.is(target, comparison)) {
+                        self.watchers[fullDotNotationKey].forEach(callback => callback(target[key]))
+                    }
+
+                    return comparison[part]
+                }, stores)
+            })
     }
 }

+ 12 - 1
src/index.js

@@ -4,6 +4,7 @@ import EventBus from './bus'
 
 const Spruce = {
     options: {
+        enableUpdateEvents: true,
         globalStoreVariable: false,
     },
 
@@ -22,8 +23,14 @@ const Spruce = {
         })
 
         this.stores = createObservable(this.stores, {
-            set: (key, value) => {
+            set: (target, key, value) => {
+                this.events.runWatchers(this.stores, target, key)
+
                 this.updateSubscribers(key, value)
+
+                if (this.options.enableUpdateEvents) {
+                    this.emit('updated')
+                }
             }
         })
 
@@ -68,6 +75,10 @@ const Spruce = {
 
     emit(name, data = {}) {
         this.events.emit(name, { ...data, store: this.stores })
+    },
+
+    watch(dotNotation, callback) {
+        this.events.watch(dotNotation, callback)
     }
 }
 

+ 1 - 1
src/observable.js

@@ -20,7 +20,7 @@ export const createObservable = (target, callbacks) => {
                 value = createObservable(value, callbacks)
             }
 
-            callbacks.set(key, target[key] = value)
+            callbacks.set(target, key, target[key] = value)
 
             return true
         }

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно