-
Notifications
You must be signed in to change notification settings - Fork 281
Published Properties
enyo.Object implements the Enyo framework's property publishing system. Published properties are declared in a hash called published within a call to enyo.kind. Getter and setter methods are automatically generated for properties declared in this manner. Also, by convention, the setter for a published property will trigger an optional <propertyName>Changed method when called.
In the following example, myValue becomes a regular property on the MyObject prototype (with a default value of 3), and the getter and setter methods are generated as noted in the comments:
enyo.kind({
name: "MyObject",
kind: enyo.Object,
// declare 'published' properties
published: {
myValue: 3
},
// These methods will be automatically generated:
// getMyValue: function() ...
// setMyValue: function(inValue) ...
// optional method that is called whenever setMyValue is called
myValueChanged: function(inOldValue) {
this.delta = this.myValue - inOldValue;
}
});
Since we have declared a changed method (i.e., myValueChanged) to observe set calls on the myValue property, it will be called when setMyValue is called, as illustrated by the following:
myobj = new MyObject();
var x = myobj.getMyValue(); // x gets 3
myobj.setMyValue(7); // myValue becomes 7; myValueChanged side-effect sets delta to 4
Changed methods are only called when setters are invoked with a different
value. If you were to call setMyValue
a second time with the same value, the
changed handler would not be invoked:
myobj.setMyValue(7); // myValue stays 7; myValueChanged is *not* called
Published properties are stored as regular properties on the object prototype, so it's possible to query or set their values directly:
var x = myobj.myValue;
Note that when you set a property's value directly, the changed method is not called.
In most cases, published properties should only contain basic values, like
numbers and strings. If you use an array or an object as the value of a
property, the mechanism that detects changes will likely fail. This is because
JavaScript comparisons only change the outmost object. A getProperty
call
that returns an object or array returns a reference to the internal state, since
if you then modify that object or array, you modify the same instance that's
held inside the kind instance.
You could work around this by overriding the getProperty
call and having it
use enyo.clone
to make a shallow copy of the object or array. Then, if you
pass that object into setProperty
, it won't be considered equal to the
internal one, since it's a different object in memory. However, you would have
a new problem in that propertyChanged
will be called even if the two objects
have all the same contents.