container.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. define(function(require, exports, module) {
  2. function itemRemove() {
  3. this.container.removeItem(this);
  4. return this;
  5. }
  6. return require('../core/class').createClass('Container', {
  7. getItems: function() {
  8. return this.items || (this.items = []);
  9. },
  10. getItem: function(index) {
  11. return this.getItems()[index];
  12. },
  13. getFirstItem: function() {
  14. return this.getItem(0);
  15. },
  16. getLastItem: function() {
  17. return this.getItem(this.getItems().length - 1);
  18. },
  19. indexOf: function(item) {
  20. return this.getItems().indexOf(item);
  21. },
  22. eachItem: function(fn) {
  23. var items = this.getItems(),
  24. length = items.length,
  25. i;
  26. for (i = 0; i < length; i++) {
  27. fn.call(this, i, items[i]);
  28. }
  29. return this;
  30. },
  31. addItem: function(item, pos, noEvent) {
  32. var items = this.getItems(),
  33. length = items.length;
  34. if (~items.indexOf(item)) {
  35. return this;
  36. }
  37. if (!(pos >= 0 && pos < length)) {
  38. pos = length;
  39. }
  40. items.splice(pos, 0, item);
  41. if (typeof(item) === 'object') {
  42. item.container = this;
  43. item.remove = itemRemove;
  44. }
  45. this.handleAdd(item, pos);
  46. if (!noEvent) {
  47. this.onContainerChanged('add', [item]);
  48. }
  49. return this;
  50. },
  51. addItems: function(items) {
  52. for (var i = 0, l = items.length; i < l; i++) {
  53. this.addItem(items[i], -1, true);
  54. }
  55. this.onContainerChanged('add', items);
  56. return this;
  57. },
  58. setItems: function(items) {
  59. return this.clear().addItems(items);
  60. },
  61. appendItem: function(item) {
  62. return this.addItem(item);
  63. },
  64. prependItem: function(item) {
  65. return this.addItem(item, 0);
  66. },
  67. removeItem: function(pos, noEvent) {
  68. if (typeof(pos) !== 'number') {
  69. return this.removeItem(this.indexOf(pos));
  70. }
  71. var items = this.getItems(),
  72. length = items.length,
  73. item = items[pos];
  74. if (item === undefined) {
  75. return this;
  76. }
  77. items.splice(pos, 1);
  78. if (item.container) {
  79. delete item.container;
  80. }
  81. if (item.remove) {
  82. delete item.remove;
  83. }
  84. this.handleRemove(item, pos);
  85. if (!noEvent) {
  86. this.onContainerChanged('remove', [item]);
  87. }
  88. return this;
  89. },
  90. clear: function() {
  91. var removed = [];
  92. var item;
  93. while ((item = this.getFirstItem())) {
  94. removed.push(item);
  95. this.removeItem(0, true);
  96. }
  97. this.onContainerChanged('remove', removed);
  98. return this;
  99. },
  100. onContainerChanged: function(type, items) {},
  101. handleAdd: function(item, index) {},
  102. handleRemove: function(item, index) {}
  103. });
  104. });