123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /**
- * A utility that gets and sets properties of model elements.
- *
- * @param {Model} model
- */
- export default function Properties(model) {
- this.model = model;
- }
- /**
- * Sets a named property on the target element.
- * If the value is undefined, the property gets deleted.
- *
- * @param {Object} target
- * @param {String} name
- * @param {Object} value
- */
- Properties.prototype.set = function(target, name, value) {
- var property = this.model.getPropertyDescriptor(target, name);
- var propertyName = property && property.name;
- if (isUndefined(value)) {
- // unset the property, if the specified value is undefined;
- // delete from $attrs (for extensions) or the target itself
- if (property) {
- delete target[propertyName];
- } else {
- delete target.$attrs[name];
- }
- } else {
- // set the property, defining well defined properties on the fly
- // or simply updating them in target.$attrs (for extensions)
- if (property) {
- if (propertyName in target) {
- target[propertyName] = value;
- } else {
- defineProperty(target, property, value);
- }
- } else {
- target.$attrs[name] = value;
- }
- }
- };
- /**
- * Returns the named property of the given element
- *
- * @param {Object} target
- * @param {String} name
- *
- * @return {Object}
- */
- Properties.prototype.get = function(target, name) {
- var property = this.model.getPropertyDescriptor(target, name);
- if (!property) {
- return target.$attrs[name];
- }
- var propertyName = property.name;
- // check if access to collection property and lazily initialize it
- if (!target[propertyName] && property.isMany) {
- defineProperty(target, property, []);
- }
- return target[propertyName];
- };
- /**
- * Define a property on the target element
- *
- * @param {Object} target
- * @param {String} name
- * @param {Object} options
- */
- Properties.prototype.define = function(target, name, options) {
- Object.defineProperty(target, name, options);
- };
- /**
- * Define the descriptor for an element
- */
- Properties.prototype.defineDescriptor = function(target, descriptor) {
- this.define(target, '$descriptor', { value: descriptor });
- };
- /**
- * Define the model for an element
- */
- Properties.prototype.defineModel = function(target, model) {
- this.define(target, '$model', { value: model });
- };
- function isUndefined(val) {
- return typeof val === 'undefined';
- }
- function defineProperty(target, property, value) {
- Object.defineProperty(target, property.name, {
- enumerable: !property.isReference,
- writable: true,
- value: value,
- configurable: true
- });
- }
|