Skip to content

Commit

Permalink
implemented getters for plain objects, see #421
Browse files Browse the repository at this point in the history
  • Loading branch information
mweststrate committed Aug 31, 2016
1 parent b73f24f commit 3abe0e6
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/api/extendobservable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ export function extendObservableHelper(target, properties, mode: ValueMode, name
for (let key in properties) if (hasOwnProperty(properties, key)) {
if (target === properties && !isPropertyConfigurable(target, key))
continue; // see #111, skip non-configurable or non-writable props for `observable(object)`.
setObservableObjectInstanceProperty(adm, key, properties[key]);
const descriptor = Object.getOwnPropertyDescriptor(properties, key);
setObservableObjectInstanceProperty(adm, key, descriptor);
}
return target;
}
15 changes: 10 additions & 5 deletions src/types/observableobject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,16 @@ export function asObservableObject(target, name: string, mode: ValueMode = Value
return adm;
}

export function setObservableObjectInstanceProperty(adm: ObservableObjectAdministration, propName: string, value) {
if (adm.values[propName])
adm.target[propName] = value; // the property setter will make 'value' reactive if needed.
else
defineObservableProperty(adm, propName, value, true, undefined);
export function setObservableObjectInstanceProperty(adm: ObservableObjectAdministration, propName: string, descriptor: PropertyDescriptor) {
if (adm.values[propName]) {
invariant("value" in descriptor, "cannot redefine property " + propName);
adm.target[propName] = descriptor.value; // the property setter will make 'value' reactive if needed.
} else {
if ("value" in descriptor)
defineObservableProperty(adm, propName, descriptor.value, true, undefined);
else
defineObservableProperty(adm, propName, descriptor.get, true, descriptor.set);
}
}

export function defineObservableProperty(adm: ObservableObjectAdministration, propName: string, newValue, asInstanceProperty: boolean, setter) {
Expand Down
19 changes: 19 additions & 0 deletions test/babel/babel-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -726,3 +726,22 @@ test('computed setter should succeed (babel)', function(t) {

t.end();
});

test('computed getter / setter for plan objects should succeed (babel)', function(t) {
const b = observable({
a: 3,
get propX() { return this.a * 2 },
set propX(v) { this.a = v }
})

const values = []
mobx.autorun(() => values.push(b.propX))
t.equal(b.propX, 6);
b.propX = 4;
t.equal(b.propX, 8);

t.deepEqual(values, [6, 8])

t.end();
});

24 changes: 24 additions & 0 deletions test/observables.js
Original file line number Diff line number Diff line change
Expand Up @@ -1852,3 +1852,27 @@ test("support computed property getters / setters", t => {
d()
t.end()
})

test('computed getter / setter for plan objects should succeed', function (t) {
var b = observable({
a: 3,
get propX() {
return this.a * 2;
},
set propX(v) {
this.a = v;
}
});

var values = [];
mobx.autorun(function () {
return values.push(b.propX);
});
t.equal(b.propX, 6);
b.propX = 4;
t.equal(b.propX, 8);

t.deepEqual(values, [6, 8]);

t.end();
});
19 changes: 19 additions & 0 deletions test/typescript-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -943,3 +943,22 @@ test("505, don't throw when accessing subclass fields in super constructor (type
t.deepEqual(values, { a: 1, b: undefined}) // undefined, as A constructor runs before B constructor
t.end()
})


test('computed getter / setter for plan objects should succeed (typescript)', function(t) {
const b = observable({
a: 3,
get propX() { return this.a * 2 },
set propX(v) { this.a = v }
})

const values: number[] = []
mobx.autorun(() => values.push(b.propX))
t.equal(b.propX, 6);
b.propX = 4;
t.equal(b.propX, 8);

t.deepEqual(values, [6, 8])

t.end();
});

0 comments on commit 3abe0e6

Please sign in to comment.