2014-12-08 8 views
11

Czy mogę otrzymać informacje o tym, co zostało zwrócony przez użytkownika $$ zaktualizowane, lub czy ma ono aktualizację $$, uruchomić funkcję, którą mogę następnie otrzymywać za każdym razem, gdy zadanie jest odliczane?

Pod koniec dnia muszę liczyć liczbę zadań wykonanych przez użytkowników. Wygląda na to, że baza Firebase ma sposoby automatycznej synchronizacji tych danych, ale nie jest jasne, jak to zrobić. Wystąpiły problemy z funkcją $ watch i uruchomieniem po zakończeniu zadania. Wygląda to na ciekawy sposób, ale nie mogę połączyć tych elementów.

Oto plnkr z poniższym kodzie pracy: 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 
    }; 
}]); 

Odpowiedz

6

Jeśli chcesz zgadzają up-to-date wszystkich zrealizowanych zadań, można dodać then do punktu, gdzie można zapisać zadanie:

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

blok then wykonuje po zadaniem zbawił i dodaje zgadzają ukończonych zadań do bieżącego zakresu.

+0

Dzięki za odpowiedź. Tak to teraz robię. Powinien istnieć sposób powiązania tej funkcji z tablicą bezpośrednio, tak aby po dodaniu/usunięciu/zmianie zadania aktualizacja odbywała się automatycznie na serwerze/lokalnie. Właśnie to staram się rozgryźć. – EmptyPockets

+0

Nie jestem pewien, czy tego właśnie szukasz, ale to powiązanie w widoku działa: 'done count: {{listWithTotal.getTotal()}}' –

+0

To by działało (prawdopodobnie w moim przypadku mam serię użytkowników, ale to nie ma związku), ale chcę sprawdzić, czy mogę to zrobić, zastępując funkcję $$ updated. Wydaje się, że ta funkcjonalność wewnątrz tablicy $ firebase byłaby czystsza i łatwiejsza w utrzymaniu. Będę musiał wykonać inne czynności, takie jak tworzenie kopii zadań i przenoszenie ich na różne listy, itp. – EmptyPockets

Powiązane problemy