Ver Fonte

add $set method for observed objects

Evan You há 11 anos atrás
pai
commit
00d423d2d9
2 ficheiros alterados com 29 adições e 2 exclusões
  1. 18 0
      src/observer/object.js
  2. 11 2
      test/unit/specs/observer/observer_spec.js

+ 18 - 0
src/observer/object.js

@@ -34,6 +34,24 @@ _.define(
   }
 )
 
+/**
+ * Set a property on an observed object, calling add to
+ * ensure the property is observed.
+ *
+ * @param {String} key
+ * @param {*} val
+ * @public
+ */
+
+_.define(
+  objProto,
+  '$set',
+  function $set (key, val) {
+    this.$add(key, val)
+    this[key] = val
+  }
+)
+
 /**
  * Deletes a property from an observed object
  * and emits corresponding event

+ 11 - 2
test/unit/specs/observer/observer_spec.js

@@ -89,7 +89,7 @@ describe('Observer', function () {
     expect(watcher.update.calls.count()).toBe(3)
   })
 
-  it('observing $add/$delete', function () {
+  it('observing $add/$set/$delete', function () {
     var obj = { a: 1 }
     var ob = Observer.create(obj)
     var dep = new Dep()
@@ -105,9 +105,18 @@ describe('Observer', function () {
     obj.$add('b', 3)
     expect(obj.b).toBe(2)
     expect(dep.notify.calls.count()).toBe(2)
+    // set existing key, should be a plain set and not
+    // trigger own ob's notify
+    obj.$set('b', 3)
+    expect(obj.b).toBe(3)
+    expect(dep.notify.calls.count()).toBe(2)
+    // set non-existing key
+    obj.$set('c', 1)
+    expect(obj.c).toBe(1)
+    expect(dep.notify.calls.count()).toBe(3)
     // should ignore deleting non-existing key
     obj.$delete('a')
-    expect(dep.notify.calls.count()).toBe(2)
+    expect(dep.notify.calls.count()).toBe(3)
     // should work on non-observed objects
     var obj2 = { a: 1 }
     obj2.$delete('a')