2014-12-15 5 views
5

Ich benutze Ionic Framework für eine App und halte mich an einen Teil. In meiner App habe ich eine Favoritenansicht, die eine Liste von Elementen anzeigt, die ein Benutzer an anderer Stelle in der App hat. Das Problem ist, dass der Code im Controller nur einmal ausgeführt wird, wenn die Favoritenroute zum ersten Mal getroffen wird. Wenn ein Benutzer dann einen Favoriten an einer anderen Stelle in der App hinzufügt und dann zur Ansicht "Favoriten" zurückkehrt, wird die Liste nicht erneut erstellt.Wie kann ich einen Controller in Angularjs aktualisieren?

In meinem Controller, ich habe folgendes:

Favourites.all().then(function(results){ 
    angular.forEach(results, function(value, key){ 
     // add results to an array to present in the view 
    }) 
}) 

Ich habe eine Fabrik, die die Datenbankabfrage funktioniert:

.factory('Favourites', function(DB){ 
    var self=this; 
    console.log("test 1"); 

    self.all = function() { 
     return DB.query('SELECT * FROM favourites') 
      .then(function(result){ 
       return DB.fetchAll(result); 
      }); 
    }; 
    return self; 
}) 

Meine Frage ist, wie kann ich die Favoriten-Controller erhalten auffrischen nachdem ein Benutzer der Datenbank einen neuen Favoriten hinzugefügt hat? Ich versuchte, dem Controller eine Funktion zum erneuten Laden des Bereichs hinzuzufügen, und fügte auch reload hinzu: true für den $ stateProvider für die Route, aber das machte keinen Unterschied.

Antwort

10

Verwenden Rundfunk von überall und fangen sie überall:

Überall in Ihrer App:

$scope.onNewFavoriteHandler = function() { 
    //Add to DB logic 
    $rootScope.$broadcast('new-favorite'); 
} 

Auf der entsprechenden Controller:

$scope.$on('new-favorite', function(event, args) { 
    Favourites.all().then(function(results){ 
     angular.forEach(results, function(value, key){ 
      // add results to an array to present in the view 
     }) 
    }); 
    // do what you want to do 
}) 

Nice artice if you wish to extend your knoledge

1

Sie ui verwenden können -router und resolve/reload(), um Ihren Controller/View neu zu laden:

.state('somestate', { 
    url: '/somestate', 
    templateUrl: '/path/to/some/view.html', 
    resolve: { 
     favorites: ['Favourites', function ($Favourites) { 
     return Favourites.all(); 
     }] 
    }, 
    controller: ['$scope', '$state', 'favorites', function ($scope, $state, favorites) { 
     angular.forEach(favorites, function(value, key){...}); 

     //...later... 
     $scope.onSomethingHappened = function reload(){ 
      var current = $state.current; 
      var params = angular.copy($stateParams); 
      $state.transitionTo(current, params, { reload: true, inherit: true, notify: true });   
    }] 
    })