From a5c772977ad785bbdaa948c39068bef568448761 Mon Sep 17 00:00:00 2001 From: Chasen Le Hara Date: Mon, 2 Jul 2018 17:13:45 -0700 Subject: [PATCH 1/2] Add a value property getter & setter to the key module/observable This adds an API for getting & setting the value of the observation returned by the key module: ```js import keyObservable from "can-simple-observable/key/key"; const outer = {inner: {key: "hello"}}; const observable = keyObservable(outer, "inner.key"); observable.value; // is "hello" observable.value = "goodbye"; observable.value; // is now "goodbye" ``` Related to https://github.com/canjs/can-observation/issues/130 --- key/key-test.js | 13 +++++++++++++ key/key.js | 15 ++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/key/key-test.js b/key/key-test.js index 9a8620b..0c78e47 100644 --- a/key/key-test.js +++ b/key/key-test.js @@ -20,6 +20,19 @@ QUnit.test("basics", function(assert) { assert.equal(canReflect.getValue(observable), "aloha", "getValue unbound"); }); +QUnit.test("value property is a getter and setter", function(assert) { + var outer = {inner: {key: "hello"}}; + var observable = keyObservable(outer, "inner.key"); + + // Check getting the value + assert.equal(observable.value, "hello", "value getter works"); + + // Check setting the value + observable.value = "aloha"; + assert.equal(canReflect.getValue(outer).inner.key, "aloha", "value setter sets other object"); + assert.equal(canReflect.getValue(observable), "aloha", "value getter works after set"); +}); + QUnit.test("get and set Priority", function(assert) { var outer = {inner: {key: "hello"}}; var observable = keyObservable(outer, "inner.key"); diff --git a/key/key.js b/key/key.js index 34b7296..7aee768 100644 --- a/key/key.js +++ b/key/key.js @@ -46,10 +46,19 @@ module.exports = function keyObservable(root, keyPath) { return value; }); + // Function for setting the value + var valueSetter = function(newVal) { + canKey.set(root, keyPathParts, newVal); + }; + + // The `value` property getter & setter + Object.defineProperty(observation, "value", { + get: observation.get, + set: valueSetter + }); + var symbolsToAssign = { - "can.setValue": function(newVal) { - canKey.set(root, keyPathParts, newVal); - } + "can.setValue": valueSetter }; //!steal-remove-start From 73916d037f7a164fa665c1b47dbcaded3202541a Mon Sep 17 00:00:00 2001 From: Chasen Le Hara Date: Tue, 3 Jul 2018 19:43:55 -0700 Subject: [PATCH 2/2] Require can-observation@^4.1.0 This is so that the `key` module can provide its own `value` getter & setter. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37167d1..3f5d465 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "can-key-tree": "^1.0.0", "can-log": "^1.0.0", "can-namespace": "1.0.0", - "can-observation": "^4.0.0", + "can-observation": "^4.1.0", "can-observation-recorder": "^1.0.0", "can-queues": "^1.0.0", "can-reflect": "^1.10.1",