Cómo ejecutar la función AngularJS controller on page load?


Actualmente tengo un Angular.página js que permite la búsqueda y muestra los resultados. El usuario hace clic en un resultado de búsqueda, luego hace clic en el botón atrás. Quiero que los resultados de la búsqueda se muestren de nuevo, pero no puedo averiguar cómo activar la búsqueda para ejecutarla. Aquí está el detalle:

  • Mi Angular.js page es una página de búsqueda, con un campo de búsqueda y una búsqueda botón. El usuario puede escribir manualmente una consulta y presionar un botón y y la consulta ajax se dispara y se muestran los resultados. Actualizo el URL con el término de búsqueda. Todo eso funciona bien.
  • El usuario hace clic en un resultado de la búsqueda y es llevado a una página diferente - eso también funciona bien.
  • El usuario hace clic en el botón atrás, y vuelve a mi página de búsqueda angular, y se muestra la URL correcta, incluido el término de búsqueda. Todo funciona bien.
  • He vinculado el valor del campo de búsqueda al término de búsqueda en la URL, por lo que contiene el término de búsqueda esperado. Todo funciona bien.

¿Cómo consigo que la función de búsqueda ejecutar de nuevo sin que el usuario tenga que pulsar el "botón de búsqueda"? Si fuera jquery entonces ejecutaría una función en la función documentready. No puedo ver el Angular.equivalente a js.

Author: Roshana Pitigala, 2013-03-17

13 answers

Por un lado, como @Mark-Rajcok dijo, puedes salirte con la tuya con la función interna privada:

// 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();

También puedes echar un vistazo a la directiva ng-init. La implementación será muy similar:

// 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
};

Pero ten cuidado ya que la documentación angular implica (desde v1.2) NO usar ng-init para eso. Sin embargo imo depende de la arquitectura de su aplicación.

Usé ng-init cuando quería pasar un valor del back-end a la aplicación angular:

<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>
 408
Author: Dmitry Evseev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-08 10:33:43

Pruebe esto?

$scope.$on('$viewContentLoaded', function() {
    //call it here
});
 132
Author: holographic-principle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-17 08:52:06

Nunca logré que $viewContentLoaded funcionara para mí, y ng-init realmente solo debería usarse en un ng-repeat (según la documentación), y también llamar a una función directamente en un controlador puede causar errores si el código se basa en un elemento que aún no se ha definido.

Esto es lo que hago y funciona para mí:

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

A menos que estés usando ui-router. Entonces es:

$scope.$on('$stateChangeSuccess', function () {
  // do something
});
 59
Author: adam0101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-25 12:59:21
angular.element(document).ready(function () {

    // your code here

});
 41
Author: Karly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-26 00:54:29

La solución de Dimitri/Mark no funcionó para mí, pero usar la función tim timeout parece funcionar bien para garantizar que su código solo se ejecute después de que se renderice el marcado.

# Your controller, including $timeout

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

$timeout($scope.init)

Espero que ayude.

 29
Author: guico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-30 12:30:40

Puede hacer esto si desea ver el objeto DOM viewContentLoaded para cambiar y luego hacer algo. usando scope scope.on on también funciona, pero de manera diferente, especialmente cuando tiene un modo de página en su enrutamiento.

 $scope.$watch('$viewContentLoaded', function(){
    // do something
 });
 25
Author: CodeOverRide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 00:27:54

Puede usar el objeto angular window de angular:

$window.onload = function(e) {
  //your magic here
}
 18
Author: mcgraw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-01 11:38:26

Otra alternativa:

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

(vía https://stackoverflow.com/a/30258904/148412 )

 4
Author: ANeves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:24

Otra alternativa si tienes un controlador específico para esa página:

(function(){
    //code to run
}());
 3
Author: Chipe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-01 15:44:19

Al usar rout routeProvider puede resolver sobre.estado y arranque su servicio. Es decir, va a cargar el Controlador y la vista, solo después de resolver su Servicio:

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

Servicio

function ourBootstrapService() {

 function init(){ 
    // this is what we need
 }
}
 3
Author: Leo Lanese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-12 08:40:47

Encontrado Dmitry Evseev respuesta bastante útil.

Caso 1: Usando AngularJS solo:
Para ejecutar un método al cargar la página, puede usar ng-init en el método view and declare init en el controlador, habiendo dicho que no se recomienda el uso de funciones más pesadas, según los documentos angular en ng-init :

Se puede abusar de esta directiva para añadir cantidades innecesarias de lógica a sus plantillas. Solo hay unos pocos usos apropiados de ngInit, como para aliasing propiedades especiales de ngRepeat, como se ve en la demostración a continuación; y para inyectar datos a través de scripts del lado del servidor. Además de estos pocos casos, debe usar controladores en lugar de ngInit para inicializar valores en un ámbito.

HTML:

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

Controlador:

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

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

    doSearch($routeParams.searchKeyword);
})

Advertencia: No utilice este controlador para otra vista destinada a una intención diferente, ya que hará que el método de búsqueda se ejecute allí también.

Caso 2: Uso Iónico:
El código anterior funcionará, solo asegúrese de que la caché de vista esté desactivada en el route.js como:

Ruta.js

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

Espero que esto ayude

 3
Author: Kailas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 05:50:06

Tuve el mismo problema y solo esta solución funcionó para mí (ejecuta una función después de que se haya cargado un DOM completo). Utilizo esto para el desplazamiento para anclar después de que la página se ha cargado:

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

                        // Your function that runs after all DOM is loaded

                    });
 3
Author: Ginko Balboa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 10:34:38

Puede guardar los resultados de búsqueda en un servicio común que puede usar desde cualquier lugar y no se borra cuando navega a otra página, y luego puede configurar los resultados de búsqueda con los datos guardados para el clic del botón atrás

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

Para el botón trasero

function Backbutton() {
    RetrievedData = CommonFunctionalityService.retrieveResults();
}
 2
Author: Heshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 20:48:02