Cómo usar un Ng-if con Firebase

Sé que la directiva ng-if crea un nuevo ámbito secundario y me gustaría saber CÓMO y SI es posible jugar un ng-if en otro.

Por ahora no puedo ver ningún ícono. Intenté ng-hide, pero vi los dos íconos al mismo tiempo, imposible solucionar ese problema ... También probé ng-show, pero con los mismos resultados que ng-if.

La función Set () devuelve verdadero o falso, está funcionando porque puedo ver el resultado en la consola.

Algunas ideas ?

$scope.set = function($r)
{
    firebase.database().ref('events/'+$r.selfID).once("value").then(function(snapshot)
    {   
        var nbPerson = snapshot.val().nbPerson;
        var varPerson = snapshot.val().varPerson;

        //console.log("nbPerson :", nbPerson);
        //console.log("varPerson", varPerson);

        if(nbPerson === varPerson)
        {
            //console.log("true");
            return true;
        }
        else
        {
            //console.log("false");
            return false;
        }
    });
};
<button ng-if ="give(f) === false" class="badge badge-positive" ng-click="joinEvent(e)">

    <span ng-if ="set(r) === true">
        <ion-icon class="ion-person-add give-var"></ion-icon>
    </span>


    <span ng-if ="set(r) === false">
        <ion-icon class="ion-person-add var"></ion-icon>
    </span>

</button>

EDITAR:

Agregué la función set (), $ r es un registro de un Firebase DB, tiene una variable "selfID" con su ID de registro.

Estoy seguro de que la función give () está funcionando, porque tengo otro botón ejecutándose con ng-if = "give (f) === true".

Todo este código funciona en el mismo controlador.

EDITAR 2: (nuevo fragmento)

EDITAR 3: (agregue $ q en dependencia)

function ($scope, $rootScope, $q, $stateParams, $firebase, $firebaseArray, $state, $ionicPopup) {

    $scope.set = function($r)
    {
        $scope.varPerson = "";
        $scope.nbPerson = "";

        var basePromise = firebase.database().ref('events/'+$r.selfID).once("value");

        $q.when(basePromise).then(function(snapshot)
        {
            $scope.nbPerson = snapshot.val().nbPerson;
            $scope.varPerson = snapshot.val().varPerson;

            if($scope.nbPerson === $scope.varPerson)
            {
                return true;
            }
            else
            {
                return false;
            }
        });
    }
};

EDIT 4: (Finalmente)

Ok, no pude hacer frente a los problemas sincrónicos, así que simplemente agregué una prueba dentro de los dos ng-if, así que sin la función set ().

¡Muchas gracias por quienes me ayudaron, y especialmente @georgeawg por su experiencia!

    <span ng-if ="r.nbPerson === r.varPerson">
        <ion-icon class="ion-person-add give-var"></ion-icon>
    </span>

    <span ng-if ="r.nbPerson > r.varPerson">
        <ion-icon class="ion-person-add var"></ion-icon>
    </span>

Respuestas a la pregunta(2)

Su respuesta a la pregunta