2014-12-15 22 views
5

Sto usando Ionic Framework per un'applicazione e sto incollando su una parte. Nella mia app ho una vista Preferiti, che mostra un elenco di elementi che un utente ha preferito altrove nell'app. Il problema è che il codice nel controller viene eseguito solo la prima volta che viene colpito il percorso Preferiti. Se un utente aggiunge un preferito da qualche altra parte nell'app, quindi torna alla visualizzazione Preferiti, l'elenco non viene rigenerato.Come posso aggiornare un controller in Angularjs?

Nel mio controller, ho il seguente:

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

ho una fabbrica che fa la query di database:

.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; 
}) 

La mia domanda è: come posso ottenere il controller Preferiti per aggiornare dopo che un utente ha aggiunto un nuovo preferito al database? Ho provato ad aggiungere una funzione di ricarica dello scope al controller e anche l'aggiunta di ricarica: true al $ stateProvider per il percorso, ma nessuno dei due ha fatto alcuna differenza.

risposta

10

Usa trasmissione da qualsiasi luogo e prendere ovunque:

ovunque nella vostra app:

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

Sul controller rilevanti:

$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

è possibile utilizzare ui -router e resolve/reload() per riavviare il controller/vista:

.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 });   
    }] 
    }) 
Problemi correlati