нравится и не нравится обзор продукта пользователем в угловых

схема пользователя:

var UserSchema = new Schema({
    review_likes :      [{type:String}],
    review_dislikes :   [{type:String}]
});

схема просмотра:

var ReviewSchema = new Schema({
    productID:{type: String, required: true},
    numoflikes:{type:Number, required:true},
    numofdislikes:{type:Number, required:true}
})

контроллер просмотра:

       .controller('reviewsController', function($route, reviewsFactory, $scope, $routeParams){
        var that=this;
        reviewid = $routeParams.id;
        productID = $routeParams.id;
        likestats = false;
        dislikestats = false;


    /*    console.log('controller',questionid)
    */    var getallReviews = function(){
        reviewsFactory.getReviews(function(data){
            that.reviews = data;
        })
    }
    getallReviews();


    var getProReviews = function(productID){
        reviewsFactory.getProductReviews(productID, function(data){
            that.proreviews = data;
        })
    }
    getProReviews(productID);
    $scope.pID=productID;

    this.addReview = function(){
        reviewsFactory.addReview(this.newReview, function(message){
            getallReviews();
            console.log(message)
            that.messages = message
        })
        this.newReview = {};
    }

    var getthatReview = function(){
        reviewsFactory.getthatReview(reviewid, function(data){
    /*            console.log('[CONTROLLER] That Question:',data);
    */            that.review = data;
            })
    }
    getthatReview();



    this.getThatReview = function(){
        reviewsFactory.getthatReview(reviewid, function(data){
            /*            console.log('[CONTROLLER] That Question:',data);*/
            reviewsFactory.checkRevLike(reviewid, function(response){

                if(response == "liked"){
                    data.likestats = true;  
                }
                else{
                    data.likestats = false;  
                }
                angular.forEach(that.proreviews,function(e){  if(e._id == reviewid)e.likestats = data.likestats; });

                angular.forEach(that.reviews,function(e){  if(e._id == reviewid)e.likestats = data.likestats; });


            })
            that.review = data;
        })
    }
    this.addlikereview = function(rId){
        reviewid = rId;

        reviewsFactory.addRevLike(rId, function(response){
            that.getThatReview();
        })
        }

    this.removelikereview = function(rId){
        reviewid = rId;

        reviewsFactory.removeRevLike(rId, function(response){
            that.getThatReview();
        })
    }

    this.checklikereview = function(review){
        reviewid = review._id;
        reviewsFactory.checkRevLike(review._id, function(response){
            if(response == "liked"){
                review.likestats = true; 
            }
            else{
                review.likestats = false; 
            }
        })
    }


    this.getThatReview2 = function(){
        reviewsFactory.getthatReview(reviewid, function(data){
            /*            console.log('[CONTROLLER] That Question:',data);*/
            reviewsFactory.checkRevDisLike(reviewid, function(response){

                if(response == "disliked"){
                    data.dislikestats = true;  
                }
                else{
                    data.dislikestats = false;  
                }
                angular.forEach(that.proreviews,function(e){  if(e._id == reviewid)e.dislikestats = data.dislikestats; });

                angular.forEach(that.reviews,function(e){  if(e._id == reviewid)e.dislikestats = data.dislikestats; });


            })
            that.review = data;
        })
    }
    this.adddislikereview = function(rId){
        reviewid = rId;

        reviewsFactory.addRevDisLike(rId, function(response){
            that.getThatReview2();
        })
    }
    this.removedislikereview = function(rId){
        reviewid = rId;

        reviewsFactory.removeRevDisLike(rId, function(response){
            that.getThatReview2();
        })
    }

    this.checkdislikereview = function(review){
        reviewid = review._id;
        reviewsFactory.checkRevDisLike(review._id, function(response){
            if(response == "disliked"){
                review.dislikestats = true; 
            }
            else{
                review.dislikestats = false; 
            }
        })
    }


})

HTML:

 <div ng-controller="reviewsController as revCtrl ">
     <div ng-repeat="review in revCtrl.proreviews>
         <div ng-init="revCtrl.checklikereview(review)"> LIKE
             <div ng-if="review.likestats" ng-href="#" ng-click="revCtrl.removelikereview(review._id)"  class="glyphicon glyphicon-star ">
             </div>
             <div ng-if="!review.likestats" ng-href="#" ng-click="revCtrl.addlikereview(review._id)"  class="glyphicon glyphicon-star-empty ">
             </div> 
             <span ng-bind="review.numoflikes"></span> 
        </div>
        <div ng-init="revCtrl.checkdislikereview(review)"> DISLIKE 
            <div ng-if="review.dislikestats" ng-href="#" ng-click="revCtrl.removedislikereview(review._id)" class="glyphicon glyphicon-star ">
            </div>
            <div ng-if="!review.dislikestats" ng-href="#" ng-click="revCtrl.adddislikereview(review._id)" class="glyphicon glyphicon-star-empty ">
            </div> 
            <span ng-bind="review.numofdislikes"></span> 
         </div>
    </div>
</div>  

я пытаюсь понравиться / не понравиться обзор в списке отзывов в вопросах

я хочу ограничить 1 нравится / не нравится отзыв от 1 пользователя

проблема, возникающая здесь, заключается в том, что при отображении в html глифик успешно изменяется мгновенно, но диапазон с ng-bind = "review.numoflikes" и ng-bind = "review.numofdislikes" не обновляется мгновенно, а обновляется на странице. обновление

база данных успешно обновляется

Кроме того, если бы вы могли помочь мне ограничить только нравится или не нравится пользователем, это было бы здорово. Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос