2014-12-08 16 views
11

È possibile ricevere ciò che viene restituito da $$ aggiornato o che $$ aggiornato esegue una funzione che posso quindi ricevere da ogni volta che un'attività viene spuntata?

Alla fine della giornata, ho bisogno di tenere un conteggio di quanti compiti gli utenti completano. Sembra che Firebase abbia modi per sincronizzare automaticamente i dati, ma non è chiaro come farlo in modo specifico. Ho avuto problemi con $ watch e funzioni in esecuzione quando un'attività è stata completata. Questo sembra un modo interessante per farlo, ma non riesco a mettere insieme i pezzi.

Qui è plnkr del codice qui sotto LAVORO: http://plnkr.co/edit/iAGvPHFWn2GSPGzBRpKh?p=preview

// Code goes here 
angular.module('app', ['firebase']); 

angular 
    .module('app') 
    .controller('main', function($scope, $firebase, $timeout, $window, ListWithTotal) { 

    var ref = new Firebase("https://plnkr.firebaseio.com"); 
    $scope.listWithTotal = ListWithTotal(ref); 

    $scope.addTask = function(task) { 
    $scope.listWithTotal.$add({ 
     title: task.title, 
     complete: false, 
     tally: 0 
    }); 
    task.title = ''; 
    }; 

    $scope.completeTask = function(task) { 
    if (task.complete === true) { 
     task.complete = true; 
     task.tally = 1; 
    } else { 
     task.complete = false; 
     task.tally = 0; 
    } 
    $scope.listWithTotal.$save(task); 
    }; 

    $scope.tallyCount = ''; 
    //it would be cool if I can get tallyCount to receive 
    //the result of getTotal or automagically with $$updated. 


}).factory("ListWithTotal", ["$FirebaseArray", "$firebase", function($FirebaseArray, $firebase) { 
    // create a new factory based on $FirebaseArray 
    var TotalFactory = $FirebaseArray.$extendFactory({ 
    getTotal: function() { 
     var total = 0; 
     angular.forEach(this.$list, function(rec) { 
     total += rec.tally; 
     }); 
     return total; 
    }, 
    $$updated: function(){ 
     return this.$list.getTotal(); 
    } 
    }); 
    return function(listRef) { 
    var sync = $firebase(listRef, {arrayFactory: TotalFactory}); 
    return sync.$asArray(); // this will be an instance of TotalFactory 
    }; 
}]); 

risposta

6

Se si desidera un conteggio up-to-date di tutte le attività completate, è possibile aggiungere un then al punto in cui si salva il compito:

$scope.listWithTotal.$save(task).then(function() { 
    $scope.tallyCount = $scope.listWithTotal.getTotal(); 
}); 

il then blocco viene eseguito dopo l'operazione ha salvato e aggiunge il conteggio delle attività completate per l'ambito corrente.

+0

Grazie per la risposta. Questo è il modo in cui lo sto facendo ora. Ci dovrebbe essere un modo per collegare direttamente questa funzionalità all'array in modo che ogni volta che un'attività viene aggiunta/rimossa/modificata l'aggiornamento avvenga automaticamente sul server/localmente. Questo è quello che sto cercando di capire. – EmptyPockets

+0

Non sono sicuro se questo è quello che stai cercando, ma questo legame nella vista funziona: 'count completato: {{listWithTotal.getTotal()}}' –

+0

Funzionerebbe (probabilmente, nel mio caso, ho una serie di utenti ma non è correlato), ma voglio vedere se riesco a farlo sovrascrivendo la funzione $$ aggiornata. Sembra che avere quella funzionalità all'interno dell'array $ firebase sia più pulita e più facile da mantenere. Dovrò fare altre cose come creare copie delle attività e spostarle in elenchi diversi, ecc. – EmptyPockets

Problemi correlati