PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/example/chat/views/backbone.html

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