decorators.html 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>QUnit Example</title>
  6. <link rel="stylesheet" href="qunit-1.14.0.css">
  7. <script src="jquery-2.1.0.js" type="text/javascript"></script>
  8. <script src="jquery.sortable.js" type="text/javascript"></script>
  9. <script src="decorators.js"></script>
  10. <script>
  11. $(function () {
  12. var Selection = clazz(Object, {
  13. construct: function () {
  14. this.data = ["value1", "value2"]
  15. },
  16. render: function () {
  17. var markup = "<ul>";
  18. for (var i = 0; i < this.data.length; i++) {
  19. markup += "<li>" + this.renderItem(this.data[i]) + "</li>";
  20. }
  21. markup += "</ul>";
  22. return markup;
  23. },
  24. renderItem: function (item) {
  25. return item;
  26. },
  27. bind: function (container) {
  28. $(container).on("click", "li", function () {
  29. alert("clicked: " + $(this).text());
  30. })
  31. }
  32. });
  33. var ClearExtension = clazz(Object, {
  34. construct: function (opts) {
  35. this.opts = opts;
  36. },
  37. renderItem: function (item) {
  38. var markup = this.decorated(item);
  39. if (this.opts.position === "right") {
  40. markup += " <a href='#' class='clear'>x</a>";
  41. } else {
  42. markup = " <a href='#' class='clear'>x</a>" + markup;
  43. }
  44. return markup;
  45. },
  46. bind: function (container) {
  47. this.decorated(container);
  48. container.on("click", "a.clear", function (e) {
  49. alert("clear: " + $(this).parents("li").text());
  50. e.stopPropagation();
  51. });
  52. }
  53. });
  54. var SortableExtension = clazz(Object, {
  55. bind: function (container) {
  56. this.decorated(container);
  57. $(container).find("ul").sortable().bind('sortupdate', function () {
  58. alert("sorted");
  59. });
  60. }
  61. });
  62. var FooterExtension=clazz(Object, {
  63. render: function() {
  64. return this.decorated()+"<div>I am a footer</div>";
  65. }
  66. });
  67. var selection = new Selection();
  68. selection
  69. .decorateWith(new ClearExtension({position: "right"}))
  70. .decorateWith(new SortableExtension())
  71. .decorateWith(new FooterExtension());
  72. var markup = selection.render();
  73. $("#container").html(markup);
  74. selection.bind($("#container"));
  75. });
  76. </script>
  77. </head>
  78. <body>
  79. <div id="container"></div>
  80. </body>
  81. </html>