0

I use vuejs for the app and firebase for the database services.

The database structure looks as below: enter image description here

The initial state of the the app is as follows:

const state :{
    newStatus: [],
    statuses: [],
    initialStatusFetched: false
}

When the app is created the fullowing events are triggered in the created() lifecycle hook which fetch the statuses from the firebase and add it to the arrays in the initial state mentioned above:

created(){
    //fetches initial status and adds it to statuses[ ]
    function fetchStatus() {
        const ref = firebase.database().ref(); 
        ref.child("allstatuses").once('value', (snapshot) => {
            snapshot.forEach((childSnap) => {
                let childKey = childSnap.ke;
                let childData = childSnap.val();
                let statusData = {
                    key: childKey,
                    statusVal : childData
                }
                state.statuses.unshift(statusData);
                state.loader = false;
                state.initialStatusFetched = true;
            });
        });
    };

    //fetches newly added status and adds it to newStatus[ ]
    function statusAdded() {
        const ref = firebase.database().ref(); 
        ref.child("allstatuses").on('child_added', function(status) {
            if(state.initialStatusFetched){
                let statusData = {
                    key: status.key,
                    statusVal: status.val()
                }
                state.newStatus.push(statusData);
            }
        });
    };

} 

Now using the arrays which gets filled with the events triggered above I populate the page with statuses using the following template:

<template>
    <div>
      <div>    
          <!--statuses-->
      <div v-for="status in statuses" class="media my-media"> 
          // ommitted all the un-important part
          <div class="media-body">

              <button @click="addlike(status.key, userStatus.loggedIn)" class="btn my-btn">Like</button>
            //displaying number of likes
              <span style="margin-right:20px">{{ status.statusVal.likes }}</span>
              <button @click="addDislike(status.key, userStatus.loggedIn)" class="btn my-btn">Disike</button>
            //displaying number of dislikes
              <span>{{ status.statusVal.dislikes }}</span> 

          </div>          
      </div>
      </div>
  </div>    
</template> 

so now the problem i am facing is

function updateLikes() {
        const ref = firebase.database().ref(); 
        ref.child("allstatuses/" + statuskey + "/likes").on('value', (snapshot) => {
            // hiw can I fetch the value os statusKey so i can use it above
            console.log(snapshot.val());
        });
    }; 
  • how can I get the value of statusKey so I can use it to refer to the node and update the value of likes using the above code?

  • how do i know which status's likes got updated in the database and where that particular status is in the statuses[ ] , since statuses [ ] gets on added by new statuses?

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
boomboxboy
  • 2,384
  • 5
  • 21
  • 33

2 Answers2

1

For q1: you'll need to keep the key of each item in the HTML and then pass that into updateLikes() when the user clicks on it. Probably using a transaction:

function updateLikes(statuskey) {
    const ref = firebase.database().ref(); 
    ref.child("allstatuses/" + statuskey + "/likes")
       .transaction(function(currentValue) {
         return (currentValue || 0) + 2
       });

For q2: listen for the child_changed event, which fires when the data of a child changes. Given that you already kept the key for each item in the answer for q1, you can now look up the element in the HTML that needs to be updated:

    ref.child("allstatuses").on('child_changed', function(status) {
        var statusElm = document.getElementById(status.key);
        ... update the HTML for the new status
    });
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Using transaction ti write to the database was working gud,,, the 2nd part confused me.... thank you very much – boomboxboy Apr 13 '17 at 07:37
0

Well, a dont know vue.js, but in pure Javascript It would be something like this:

<div id="likes"></div>

Inside your ref.on('value', function(snap){})You will map until you reach the child "likes" and put the value in the variable value for example and:

let likes = document.getElementById('likes');
likes.innerHTML(value);
Lucas Torres
  • 222
  • 1
  • 2
  • 12
  • Yup that I know , since the posts are in array how to know which likes is to be updated as i dont know where the post would be in the array at a point of time – boomboxboy Apr 12 '17 at 10:38