Comment exécuter la fonction de controller AngularJS lors du chargement d'une page?

actuellement j'ai un angle.page js qui permet la recherche et affiche des résultats. L'utilisateur clique sur un résultat de recherche, puis clique sur le bouton Retour. Je veux que les résultats de la recherche soient affichés de nouveau mais je ne peux pas trouver comment déclencher la recherche à exécuter. Voici le détail:

  • Mon Angulaire.js de la page est une page de recherche, avec un champ de recherche et une recherche bouton. L'utilisateur peut saisir manuellement une requête et appuyer sur un bouton et et la requête ajax est déclenché et les résultats sont affichés. Je mets à jour L'URL avec le terme de recherche. Que tous fonctionne bien.
  • l'utilisateur clique sur le résultat de la recherche et est amené à une page différente - qui fonctionne très bien aussi.
  • l'utilisateur clique sur le bouton Retour, et retourne à ma page de recherche angulaire, et L'URL correcte est affichée, y compris le terme de recherche. Tout fonctionne très bien.
  • j'ai lié la valeur du champ de recherche au terme de recherche dans L'URL, il contient donc la recherche attendue terme. Tout fonctionne très bien.

Comment faire pour que la fonction de recherche s'exécute à nouveau sans que l'utilisateur n'ait à appuyer sur le "bouton de recherche"? Si c'était jquery alors j'exécuterais une fonction dans la fonction documentready. Je ne vois pas l'angle.js équivalent.

337
demandé sur Roshana Pitigala 2013-03-17 11:43:56

13 réponses

d'un côté comme @Mark-Rajcok a dit que vous pouvez simplement vous en tirer avec la fonction intérieure privée:

// at the bottom of your controller
var init = function () {
   // check if there is query in url
   // and fire search in case its value is not empty
};
// and fire it after definition
init();

vous pouvez également jeter un oeil à ng-init directive. La mise en œuvre ressemblera beaucoup à:

// register controller in html
<div data-ng-controller="myCtrl" data-ng-init="init()"></div>

// in controller
$scope.init = function () {
    // check if there is query in url
    // and fire search in case its value is not empty
};

mais prendre soin de lui comme documentation angulaire implique (depuis v1.2) à ne pas utiliser ng-init pour cela. Cependant omi cela dépend de l'architecture de votre application.

j'ai utilisé ng-init quand je voulais passer une valeur de back-end à Angular app:

<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>
408
répondu Dmitry Evseev 2013-12-08 10:33:43

essayez ça?

$scope.$on('$viewContentLoaded', function() {
    //call it here
});
132
répondu holographic-principle 2013-03-17 08:52:06

Je ne pourrais jamais obtenir $viewContentLoaded pour travailler pour moi, et ng-init devrait vraiment être utilisé dans un ng-repeat (selon la documentation), et appeler une fonction directement dans un contrôleur peut causer des erreurs si le code repose sur un élément qui n'a pas encore été défini.

C'est ce que je fais et cela fonctionne pour moi:

$scope.$on('$routeChangeSuccess', function () {
  // do something
});

sauf si vous utilisez ui-router . Alors c'est:

$scope.$on('$stateChangeSuccess', function () {
  // do something
});
59
répondu adam0101 2018-05-25 12:59:21
angular.element(document).ready(function () {

    // your code here

});
41
répondu Karly 2015-06-26 00:54:29
La solution de

Dimitri / Mark ne fonctionnait pas pour moi mais l'utilisation de la fonction $timeout semble bien fonctionner pour s'assurer que votre code ne s'exécute qu'après que le markup est rendu.

# Your controller, including $timeout

var $scope.init = function(){
 //your code
}

$timeout($scope.init)

J'espère que ça aidera.

29
répondu guico 2014-09-30 12:30:40

vous pouvez le faire si vous voulez regarder l'objet DOM chargé par ViewContent pour changer et ensuite faire quelque chose. à l'aide de $champ d'application.$on fonctionne aussi mais différemment surtout quand vous avez un mode de page sur votre routage.

 $scope.$watch('$viewContentLoaded', function(){
    // do something
 });
25
répondu CodeOverRide 2014-02-13 00:27:54

vous pouvez utiliser l'objet $window d'angular:

$window.onload = function(e) {
  //your magic here
}
18
répondu mcgraw 2016-06-01 11:38:26

une autre alternative:

var myInit = function () {
    //...
};
angular.element(document).ready(myInit);

(via https://stackoverflow.com/a/30258904/148412 )

4
répondu ANeves 2017-05-23 11:33:24

encore une autre alternative si vous avez un controller spécifique à cette page:

(function(){
    //code to run
}());
3
répondu Chipe 2015-09-01 15:44:19

lorsque vous utilisez $routeProvider vous pouvez résoudre sur .state et bootstrap votre service. C'est à dire, vous allez charger le contrôleur et la vue, seulement après résoudre votre Service:

ui-routes

 .state('nn', {
        url: "/nn",
        templateUrl: "views/home/n.html",
        controller: 'nnCtrl',
        resolve: {
          initialised: function (ourBootstrapService, $q) {

            var deferred = $q.defer();

            ourBootstrapService.init().then(function(initialised) {
              deferred.resolve(initialised);
            });
            return deferred.promise;
          }
        }
      })

Service

function ourBootstrapService() {

 function init(){ 
    // this is what we need
 }
}
3
répondu Leo Lanese 2015-11-12 08:40:47

trouvé Dmitry réponse Evseev très utile.

Cas 1: utilisation d'angularJs uniquement:

pour exécuter une méthode sur la charge de page, vous pouvez utiliser ng-init dans la vue et déclarer la méthode init dans le contrôleur, ayant dit que l'utilisation de la fonction plus lourde n'est pas recommandée, comme selon le documents angulaires sur ng-init :

cette directive peut être utilisée à mauvais escient pour ajouter les montants de logique dans vos modèles. Il n'y a que quelques utilisations appropriées de ngInit, comme pour l'Alias des propriétés spéciales de ngRepeat, comme vu dans la démo ci-dessous; et pour l'injection de données via le script côté serveur. En plus de ces quelques cas, vous devriez utiliser des controllers plutôt que ngInit pour initialiser les valeurs sur un scope.

HTML:

<div ng-controller="searchController()">
    <!-- renaming view code here, including the search box and the buttons -->
</div>

contrôleur:

app.controller('SearchCtrl', function(){

    var doSearch = function(keyword){
        //Search code here
    }

    doSearch($routeParams.searchKeyword);
})

avertissement: N'utilisez pas ce contrôleur pour une autre vue destinée à une intention différente car il provoquera la méthode de recherche être exécutée là aussi.

Cas 2 : Utilisation Ionique:

le code ci-dessus fonctionnera, assurez-vous juste que le cache de vue est désactivé dans le route.js comme:

route.js

.state('app', {
    url           : '/search',
    cache         : false, //disable caching of the view here
    templateUrl   : 'templates/search.html'   ,
    controller    : 'SearchCtrl'
  })

Espérons que cette aide

3
répondu Kailas 2016-04-15 05:50:06

j'ai eu le même problème et seule cette solution a fonctionné pour moi (elle exécute une fonction après qu'un DOM complet a été chargé). Je l'utilise pour faire défiler l'ancre après que la page a été chargée:

angular.element(window.document.body).ready(function () {

                        // Your function that runs after all DOM is loaded

                    });
3
répondu Ginko Balboa 2016-09-15 10:34:38

vous pouvez enregistrer les résultats de la recherche dans un service commun qui peut utiliser de n'importe où et ne se dégage pas lors de naviguer vers une autre page, puis vous pouvez définir les résultats de la recherche avec les données enregistrées pour le clic de Retour bouton

function search(searchTerm) {
    // retrieve the data here;
    RetrievedData = CallService();
    CommonFunctionalityService.saveSerachResults(RetrievedData);
} 

pour votre backbutton

function Backbutton() {
    RetrievedData = CommonFunctionalityService.retrieveResults();
}
2
répondu Heshan 2018-08-23 20:48:02