PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/example/chat/views/backbone.html

https://github.com/lsalvay/PonyExpress
HTML | 175 lines | 153 code | 18 blank | 4 comment | 0 complexity | b4d37e650f9af793f30b0974ab441151 MD5 | raw file
  1. <html>
  2. <head>
  3. <title>PonyExpress</title>
  4. <style>
  5. .highlighted {
  6. background: grey;
  7. }
  8. </style>
  9. <!-- dependencies !-->
  10. <script type="text/javascript" src="dependencies/jquery-1.9.1.min.js"></script>
  11. <script type="text/javascript" src="dependencies/neon.js"></script>
  12. <script type="text/javascript" src="dependencies/CustomEvent.js"></script>
  13. <script type="text/javascript" src="dependencies/CustomEventSupport.js"></script>
  14. <script type="text/javascript" src="socket.io/socket.io.js"></script>
  15. <!-- backbone !-->
  16. <script type="text/javascript" src="dependencies/underscore-min.js"></script>
  17. <script type="text/javascript" src="dependencies/backbone.js"></script>
  18. <!-- library !-->
  19. <script type="text/javascript" src="lib/PonyExpress.js"></script>
  20. <script type="text/javascript" src="lib/Plug.js"></script>
  21. <script type="text/javascript" src="lib/BackbonePlug.js"></script>
  22. <!-- demo code !-->
  23. <script type="text/javascript">
  24. // Pony Expless and backbone collections are outside document ready because data layer is not relevant to the dom existing.
  25. /* Iniciamos PonyExpress indicando donde escucha nuestro socket */
  26. window.ponyExpress = new PonyExpress({
  27. io : "http://localhost:3000"
  28. });
  29. /* Creo un modelo de mensaje con un modelo de backbone extendido indicando cual es la url donde realiza el POST de los mensajes */
  30. window.MessageModel = Backbone.Model.extend({
  31. urlRoot : "/messages",
  32. });
  33. /* Creo una colecion de mensajes backbone extendida en donde incuimos el mensaje y junto a el el modelo del mensaje */
  34. window.MessageCollection = Backbone.Collection.extend({
  35. name : "message",
  36. model : window.MessageModel
  37. });
  38. /* Creo una coleccion apartir del constructor anterior */
  39. window.messageCollection = new MessageCollection();
  40. /* Inicio un bind de pony */
  41. window.ponyExpress.bind('connect', function(){
  42. /* Obtengo el json de los mensajes */
  43. var xhrMessages = $.get('/messages');
  44. /* Si todo sale bien ejecuto la funcion */
  45. xhrMessages.done(function(data){
  46. /* Agrego los datos a la coleccion de mensajes */
  47. window.messageCollection.add(data);
  48. /* Creo un Plug de pony en donde agrego mi colecion de mensajes */
  49. window.messagePlug = new PonyExpress.BackbonePlug({
  50. collection : window.messageCollection
  51. });
  52. });
  53. });
  54. /* Inicio jQuery */
  55. $(document).ready(function(){
  56. /* Chat View sera una vista de backbone extendida con los eventos que se aplicaran sobre la vista del chat */
  57. /* Evento SEND RENDER e INITIALIZE */
  58. window.ChatView = Backbone.View.extend({
  59. tpl: _.template( $('#chat-template').html() ),
  60. events : {
  61. "click #submit" : "send"
  62. },
  63. initialize : function(config){
  64. var chatView = this;
  65. this.$el = this.targetElement || this.$el;
  66. this.el = this.$el[0];
  67. this.render();
  68. this.$el.appendTo('#chat');
  69. window.messageCollection.on('add', function(messageModel){
  70. var messageView = new MessageView({
  71. model: messageModel,
  72. id: "message-" + messageModel.id
  73. });
  74. messageView.$el.prependTo( chatView.$el.find('.messages') );
  75. });
  76. },
  77. send : function(){
  78. var user = this.$el.find('#user').val(),
  79. text = this.$el.find('#text').val();
  80. if( !user || !text ){
  81. return;
  82. }
  83. var model = new MessageModel({user: user, text: text});
  84. //Is added after the
  85. model.save();
  86. this.$el.find('#text').val("");
  87. },
  88. render : function(){
  89. this.$el.html( this.tpl({}) );
  90. }
  91. });
  92. /* Creo una vista extendida de backbone para cada mensaje con la funcion de FAV y remover el mensaje */
  93. window.MessageView = Backbone.View.extend({
  94. tpl: _.template( $('#message-template').html() ),
  95. events : {
  96. "click .highlight" : "highlightHandler",
  97. "click .remove" : "removeHandler"
  98. },
  99. initialize : function(config){
  100. var messageView = this;
  101. this.render();
  102. this.model.on('change', function(){
  103. messageView.render();
  104. });
  105. this.destroyHandler = function(){
  106. console.log('destroying', this.toJSON() );
  107. messageView.remove();
  108. }
  109. this.model.on('destroy', this.destroyHandler);
  110. return this;
  111. },
  112. highlightHandler : function(){
  113. if(this.model.get('highlight')){
  114. this.model.set('highlight', false);
  115. }else{
  116. this.model.set('highlight', true);
  117. }
  118. this.model.save();
  119. this.render();
  120. },
  121. removeHandler : function(){
  122. this.model.off('destroy', this.destroyHandler);
  123. this.model.destroy();
  124. this.remove();
  125. },
  126. render : function(){
  127. this.$el.html( this.tpl( this.model.toJSON() ) );
  128. if(this.model.get('highlight')){
  129. this.$el.addClass('highlighted');
  130. }else{
  131. this.$el.removeClass('highlighted');
  132. }
  133. }
  134. });
  135. /* Creo un chat view bajo el id Chat */
  136. window.chat = new window.ChatView({
  137. targetElement : $('#chat')
  138. })
  139. });
  140. /* Fin jQuery */
  141. </script>
  142. </head>
  143. <body>
  144. <div id="chat"></div>
  145. <script type="text/template" id="chat-template">
  146. <p>User : <input id="user" type="text"/></p>
  147. <p>Message: <textarea id="text"></textarea></p>
  148. <p><button id="submit">Enviar</button></p>
  149. <div class="messages"/>
  150. </script>
  151. <script type="text/template" id="message-template">
  152. <h2><%= user %></h2>
  153. <p><%= text %></p>
  154. <p><label class="highlight">Highlight</label> <label class="remove">Remove</label></p>
  155. </script>
  156. </body>
  157. </html>