reactive-property.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // #ReactiveProperty
  2. // A simple class that provides an reactive property interface
  3. _noopCallback = function() {};
  4. _nonReactive = {
  5. changed: _noopCallback,
  6. depend: _noopCallback
  7. };
  8. /**
  9. * @constructor
  10. * @param {any} defaultValue Set the default value for the reactive property
  11. * @param {boolean} [reactive = true] Allow the user to disable reactivity
  12. *
  13. * This api should only be in the internal.api.md
  14. */
  15. ReactiveProperty = function(defaultValue, reactive) {
  16. var self = this;
  17. var _deps = (reactive === false)? _nonReactive : new Deps.Dependency();
  18. /** @property ReactiveProperty.value
  19. * @private
  20. * This contains the non reactive value, should only be used as a getter for
  21. * internal use
  22. */
  23. self.value = defaultValue;
  24. self.onChange = function() {};
  25. self.changed = function() {
  26. _deps.changed();
  27. self.onChange(self.value);
  28. };
  29. /**
  30. * @method ReactiveProperty.get
  31. * Usage:
  32. * ```js
  33. * var foo = new ReactiveProperty('bar');
  34. * foo.get(); // equals "bar"
  35. * ```
  36. */
  37. self.get = function() {
  38. _deps.depend();
  39. return self.value;
  40. };
  41. /**
  42. * @method ReactiveProperty.set Set property to value
  43. * @param {any} value
  44. * Usage:
  45. * ```js
  46. * var foo = new ReactiveProperty('bar');
  47. * foo.set('bar');
  48. * ```
  49. */
  50. self.set = function(value) {
  51. if (self.value !== value) {
  52. self.value = value;
  53. self.changed();
  54. }
  55. };
  56. /**
  57. * @method ReactiveProperty.dec Decrease numeric property
  58. * @param {number} [by=1] Value to decrease by
  59. * Usage:
  60. * ```js
  61. * var foo = new ReactiveProperty('bar');
  62. * foo.set(0);
  63. * foo.dec(5); // -5
  64. * ```
  65. */
  66. self.dec = function(by) {
  67. self.value -= by || 1;
  68. self.changed();
  69. };
  70. /**
  71. * @method ReactiveProperty.inc increase numeric property
  72. * @param {number} [by=1] Value to increase by
  73. * Usage:
  74. * ```js
  75. * var foo = new ReactiveProperty('bar');
  76. * foo.set(0);
  77. * foo.inc(5); // 5
  78. * ```
  79. */
  80. self.inc = function(by) {
  81. self.value += by || 1;
  82. self.changed();
  83. };
  84. /**
  85. * @method ReactiveProperty.getset increase numeric property
  86. * @param {any} [value] Value to set property - if undefined the act like `get`
  87. * @returns {any} Returns value if no arguments are passed to the function
  88. * Usage:
  89. * ```js
  90. * var foo = new ReactiveProperty('bar');
  91. * foo.getset(5);
  92. * foo.getset(); // returns 5
  93. * ```
  94. */
  95. self.getset = function(value) {
  96. if (typeof value !== 'undefined') {
  97. self.set(value);
  98. } else {
  99. return self.get();
  100. }
  101. };
  102. /**
  103. * @method ReactiveProperty.toString
  104. * Usage:
  105. * ```js
  106. * var foo = new ReactiveProperty('bar');
  107. * foo.toString(); // returns 'bar'
  108. * ```
  109. */
  110. self.toString = function() {
  111. var val = self.get();
  112. return val ? val.toString() : '';
  113. };
  114. /**
  115. * @method ReactiveProperty.toText
  116. * Usage:
  117. * ```js
  118. * var foo = new ReactiveProperty('bar');
  119. * foo.toText(); // returns 'bar'
  120. * ```
  121. */
  122. self.toText = self.toString;
  123. };