adapters.coffee
1.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# The default `.` adapter thats comes with Rivets.js. Allows subscribing to
# properties on POJSOs, implemented in ES5 natives using
# `Object.defineProperty`.
Rivets.adapters['.'] =
id: '_rv'
counter: 0
weakmap: {}
subscribe: (obj, keypath, callback) ->
unless obj[@id]?
id = @counter++
Object.defineProperty obj, @id,
enumerable: false
configurable: false
writable: false
value: id
@weakmap[id] = {}
map = @weakmap[obj[@id]]
unless map[keypath]?
map[keypath] = []
value = obj[keypath]
Object.defineProperty obj, keypath,
get: -> value
set: (newValue) ->
if newValue isnt value
value = newValue
callback() for callback in map[keypath]
unless callback in map[keypath]
map[keypath].push callback
unsubscribe: (obj, keypath, callback) ->
callbacks = @weakmap[obj[@id]][keypath]
callbacks.splice callbacks.indexOf(callback), 1
read: (obj, keypath) ->
obj[keypath]
publish: (obj, keypath, value) ->
obj[keypath] = value