Skip to content

Commit 4df257e

Browse files
committed
merge
2 parents bacdf0d + d21279a commit 4df257e

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ coverage/
33
dist/
44
docs/
55
node_modules/
6+
bin/
7+
test/samples/*.js
8+
test*.*
9+
o_0.js
10+
yarn.lock

main.coffee

+49
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,55 @@ module.exports = Observable = (value, context) ->
146146
size: ->
147147
magicDependency(self)
148148
value.length
149+
if Object::toString.call(value) is '[object Object]'
150+
# proxy object properties and add notifications to mutation events
151+
defProp = (property) ->
152+
Object.defineProperty self, property,
153+
get: ->
154+
magicDependency(self)
155+
# if object property is Observable, e.g obj = Observable { a: Observable 1 }
156+
if typeof value[property]?.observe is "function"
157+
value[property]()
158+
else
159+
value[property]
160+
set: (val) ->
161+
# if object property is Observable, e.g obj = Observable { a: Observable 1 }
162+
if typeof value[property]?.observe is "function"
163+
value[property] val
164+
else
165+
value[property] = val
166+
notify value
167+
168+
defProp prop for own prop of value
169+
170+
# Proxy object methods, e.g. Object.keys(obj)
171+
[
172+
"keys"
173+
"values"
174+
"entries"
175+
].forEach (method) ->
176+
Object.defineProperty self, method,
177+
get: ->
178+
magicDependency(self)
179+
Object[method] value
180+
181+
# Extra methods for object observables
182+
extend self,
183+
# Remove an element from the object and notify observers of changes.
184+
remove: (object) ->
185+
if returnValue = value[object]
186+
delete value[object]
187+
notify(value)
188+
return returnValue
189+
190+
extend: (obj) ->
191+
magicDependency(self)
192+
value = Object.assign {}, value, obj
193+
defProp prop for own prop of obj
194+
notify value
195+
196+
# alias
197+
self.assign = self.extend
149198

150199
extend self,
151200
listeners: listeners

test/observable.coffee

+63
Original file line numberDiff line numberDiff line change
@@ -413,3 +413,66 @@ describe "Observable functions", ->
413413
done()
414414

415415
model.lastName "Bro"
416+
417+
describe "Observable object", ->
418+
it "should proxy properties", ->
419+
obj = Observable
420+
a: 1
421+
422+
assert.equal obj.a, 1
423+
assert.equal obj().a, obj.a
424+
425+
obj.a = 2
426+
427+
assert.equal obj.a, 2
428+
assert.equal obj().a, obj.a
429+
430+
it "should work with observable properties", ->
431+
obj = Observable
432+
a: Observable 1
433+
434+
assert.equal obj.a, 1
435+
assert.equal obj().a(), obj.a
436+
437+
obj().a 2
438+
439+
assert.equal obj.a, 2
440+
assert.equal obj().a(), obj.a
441+
442+
obj.a = 3
443+
444+
assert.equal obj.a, 3
445+
assert.equal obj().a(), obj.a
446+
447+
it "should compute object#extend as a dependency", ->
448+
obj = Observable
449+
a: 1
450+
451+
obj.extend b: 2
452+
453+
assert.equal obj.b, 2
454+
assert.equal obj().b, obj.b
455+
456+
# alias
457+
obj.assign c: 3
458+
459+
assert.equal obj.c, 3
460+
assert.equal obj().c, obj.c
461+
462+
it "should compute object#remove as a dependency", ->
463+
obj = Observable
464+
a: 1
465+
b: 2
466+
467+
obj.remove "b"
468+
469+
assert.equal obj.b, undefined
470+
471+
it "should proxy object methods", ->
472+
obj = Observable
473+
a: 1
474+
b: 2
475+
476+
assert.deepEqual obj.keys, ["a", "b"]
477+
assert.deepEqual obj.values, [1, 2]
478+
assert.deepEqual obj.entries, [["a", 1], ["b", 2]]

0 commit comments

Comments
 (0)