Jak wykonać funkcję kontrolera AngularJS przy ładowaniu strony?

Obecnie mam kątowy.strona js umożliwiająca wyszukiwanie i wyświetlanie wyników. Użytkownik kliknie wynik wyszukiwania, a następnie kliknie przycisk Wstecz. Chcę, aby wyniki wyszukiwania były wyświetlane ponownie, ale nie mogę dowiedzieć się, jak uruchomić wyszukiwanie do wykonania. Oto szczegóły:

    Mój Kątowy.strona js to strona wyszukiwania, z polem wyszukiwania i wyszukiwaniem guzik. Użytkownik może ręcznie wpisać zapytanie i nacisnąć przycisk i i zapytanie ajax jest wywoływany i wyniki są wyświetlane. I update the Adres URL z wyszukiwanym terminem. To wszystko działa dobrze.
  • użytkownik klika na wynik wyszukiwania i jest przenoszony na inną stronę - to również działa dobrze.
  • Użytkownik kliknie przycisk Wstecz i powróci do mojej strony wyszukiwania kątowego, a wyświetlony zostanie prawidłowy adres URL, w tym wyszukiwany termin. Wszystko działa dobrze.
  • powiązałem wartość pola wyszukiwania z wyszukiwanym terminem w adresie URL, więc zawiera ono oczekiwany termin wyszukiwania. Wszystko działa dobrze.

Jak uruchomić funkcję wyszukiwania do wykonać ponownie bez konieczności naciskania przez użytkownika przycisku "szukaj"? Gdyby to był jquery to wykonałbym funkcję w funkcji documentready. Nie widzę kąta.odpowiednik js.

Author: Roshana Pitigala, 2013-03-17

13 answers

Z jednej strony, jak powiedział @ Mark-Rajcok, możesz po prostu ujść na sucho z prywatną funkcją wewnętrzną:

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

Możesz również spojrzeć na dyrektywę ng-init . Implementacja będzie podobna do:

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

Ale uważaj na to, ponieważ dokumentacja kątowa sugeruje (od v1. 2) , aby nie używać do tego ng-init. Jednak imo to zależy od architektury aplikacji.

Użyłem ng-init, gdy chciałem przekazać wartość z back-endu do aplikacji 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 10:33:43

Spróbuj tego?

$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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-17 08:52:06

Nigdy nie mogłem uzyskać $viewContentLoaded do pracy dla mnie, a ng-init powinny być używane tylko w ng-repeat (zgodnie z dokumentacją), a także wywołanie funkcji bezpośrednio w kontrolerze może spowodować błędy, jeśli kod opiera się na elemencie, który nie został jeszcze zdefiniowany.

To jest to co robię i to działa dla mnie:

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

Chyba że używasz ui-router. Wtedy jest:

$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/doraprojects.net/template/agent.layouts/content.php on line 54
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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 00:54:29

Rozwiązanie Dimitriego / marka nie zadziałało dla mnie, ale użycie funkcji $ timeout wydaje się działać dobrze, aby upewnić się, że kod działa tylko po wyrenderowaniu znaczników.

# Your controller, including $timeout

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

$timeout($scope.init)
Mam nadzieję, że to pomoże.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-30 12:30:40

Możesz to zrobić, jeśli chcesz obejrzeć obiekt DOM VIEWCONTENTLOADED, aby go zmienić, a następnie coś zrobić. użycie $scope.$on też działa, ale inaczej, zwłaszcza gdy masz tryb jednej strony na routingu.

 $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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 00:27:54

Możesz użyć obiektu $window:

$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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 11:38:26

Inna alternatywa:

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

(via 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:24

Kolejna alternatywa, jeśli masz kontroler specyficzny dla tej strony:

(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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-01 15:44:19

Podczas używania $routeProvider można rozwiązać .stan i bootstrap swoje usługi. Oznacza to, że ładujesz kontroler i przeglądasz, dopiero po rozwiązaniu Usługi:

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

Serwis

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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 08:40:47

Odpowiedź Dmitry Evseev jest bardzo przydatna.

Przypadek 1: Używanie samego angularJs:
aby wykonać metodę podczas ładowania strony, możesz użyć ng-init w widoku i zadeklarować metodę init w kontrolerze, mówiąc, że użycie cięższej funkcji nie jest zalecane, zgodnie z angular Docs na ng-INIT :

Ta dyrektywa może być nadużywana, aby dodać niepotrzebne ilości logiki do szablonów. Istnieje tylko kilka odpowiednich zastosowań ngInit, takich jak aliasing specjalne właściwości ngRepeat, jak widać w demie poniżej; oraz do wstrzykiwania danych poprzez skrypty po stronie serwera. Poza tymi kilkoma przypadkami, powinieneś używać kontrolerów zamiast ngInit do inicjalizacji wartości w zakresie.

HTML:

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

Kontroler:

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

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

    doSearch($routeParams.searchKeyword);
})

Warning: nie używaj tego kontrolera do innego widoku przeznaczonego dla innej intencji, ponieważ spowoduje to, że metoda Wyszukiwania również zostanie uruchomiona.

Przypadek 2: Użycie Jonowy:
powyższy kod będzie działał, tylko upewnij się, że pamięć podręczna widoku jest wyłączona w route.js jako:

Trasa.js

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

Hope this helps

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 05:50:06

Miałem ten sam problem i tylko to rozwiązanie działało na mnie (uruchamia funkcję po załadowaniu pełnego DOM). Używam tego do przewijania do zakotwiczenia po załadowaniu strony:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 10:34:38

Możesz zapisać wyniki wyszukiwania we wspólnej usłudze, która może być używana z dowolnego miejsca i nie jest jasna podczas przechodzenia do innej strony, a następnie możesz ustawić wyniki wyszukiwania z zapisanymi danymi dla kliknięcia przycisku Wstecz

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

Dla Twojego backbuttona

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 20:48:02