Advertisement
Bear13th

main.js

Apr 11th, 2020
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function getIndex(list, id) {
  2.     for (var i = 0; i < list.length; i++ ) {
  3.         if (list[i].id === id) {
  4.             return i;
  5.         }
  6.     }
  7.  
  8.     return -1;
  9. }
  10.  
  11. var messageApi = Vue.resource('/message{/id}');
  12.  
  13. Vue.component('message-form', {
  14.     props: ['messages', 'messageAttr'],
  15.     data: function() {
  16.         return {
  17.             text: '',
  18.             id: ''
  19.         }
  20.     },
  21.     watch: {
  22.         messageAttr: function(newVal, oldVal) {
  23.             this.text = newVal.text;
  24.             this.id = newVal.id;
  25.         }
  26.     },
  27.     template:
  28.         '<div>' +
  29.         '<input type="text" placeholder="Write something" v-model="text" />' +
  30.         '<input type="button" value="Save" @click="save" />' +
  31.         '</div>',
  32.     methods: {
  33.         save: function() {
  34.             var message = { text: this.text };
  35.  
  36.             if (this.id) {
  37.                 messageApi.update({id: this.id}, message).then(result =>
  38.                     result.json().then(data => {
  39.                         var index = getIndex(this.messages, data.id);
  40.                         this.messages.splice(index, 1, data);
  41.                         this.text = ''
  42.                         this.id = ''
  43.                     })
  44.                 )
  45.             } else {
  46.                 messageApi.save({}, message).then(result =>
  47.                     result.json().then(data => {
  48.                         this.messages.push(data);
  49.                         this.text = ''
  50.                     })
  51.                 )
  52.             }
  53.         }
  54.     }
  55. });
  56.  
  57. Vue.component('message-row', {
  58.     props: ['message', 'editMethod', 'messages'],
  59.     template: '<div>' +
  60.         '<i>({{ message.id }})</i> {{ message.text }}' +
  61.         '<span style="position: absolute; right: 0">' +
  62.         '<input type="button" value="Edit" @click="edit" />' +
  63.         '<input type="button" value="X" @click="del" />' +
  64.         '</span>' +
  65.         '</div>',
  66.     methods: {
  67.         edit: function() {
  68.             this.editMethod(this.message);
  69.         },
  70.         del: function() {
  71.             messageApi.remove({id: this.message.id}).then(result => {
  72.                 if (result.ok) {
  73.                     this.messages.splice(this.messages.indexOf(this.message), 1)
  74.                 }
  75.             })
  76.         }
  77.     }
  78. });
  79.  
  80. Vue.component('messages-list', {
  81.     props: ['messages'],
  82.     data: function() {
  83.         return {
  84.             message: null
  85.         }
  86.     },
  87.     template:
  88.         '<div style="position: relative; width: 300px;">' +
  89.         '<message-form :messages="messages" :messageAttr="message" />' +
  90.         '<message-row v-for="message in messages" :key="message.id" :message="message" ' +
  91.         ':editMethod="editMethod" :messages="messages" />' +
  92.         '</div>',
  93.     created: function() {
  94.         messageApi.get().then(result =>
  95.             result.json().then(data =>
  96.                 data.forEach(message => this.messages.push(message))
  97.             )
  98.         )
  99.     },
  100.     methods: {
  101.         editMethod: function(message) {
  102.             this.message = message;
  103.         }
  104.     }
  105. });
  106.  
  107. var app = new Vue({
  108.     el: '#app',
  109.     template: '<messages-list :messages="messages" />',
  110.     data: {
  111.         messages: []
  112.     }
  113. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement