Как выполнить функцию angular контроллера на загрузке страницы?

В настоящее время у меня есть страница Angular.js, которая позволяет искать и отображать результаты. Пользователь нажимает на результат поиска, затем нажимает кнопку "Назад". Я хочу, чтобы результаты поиска отображались снова, но я не могу определить, как запускать поиск. Здесь подробно:

  • Моя страница Angular.js - это страница поиска с полем поиска и поиском кнопка. Пользователь может вручную ввести запрос и нажать кнопку и ajax-запрос запущен, и результаты отображаются. Я обновляю URL с поисковым запросом. Все работает нормально.
  • Пользователь нажимает на результат поиска и переносится на другую страницу - это отлично работает.
  • Пользователь нажимает кнопку "Назад" и возвращается на страницу поиска angular, и отображается правильный URL-адрес, включая поисковый запрос. Все работает нормально.
  • Я привязал значение поля поиска к поисковому запросу в URL-адресе, поэтому он содержит ожидаемый термин поиска. Все работает нормально.

Как заставить функцию поиска выполнять снова без необходимости нажатия кнопки поиска? Если бы это был jquery, я бы выполнил функцию в функции documentready. Я не вижу эквивалент Angular.js.

Ответ 1

С одной стороны, как @Mark-Rajcok сказал, что вы можете просто уйти с частной внутренней функцией:

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

Также вы можете посмотреть директиву ng-init. Реализация будет очень похожа:

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

Но будьте осторожны, поскольку angular документация подразумевает (начиная с версии 2.1), чтобы НЕ использовать ng-init для этого. Однако это зависит от архитектуры вашего приложения.

Я использовал ng-init, когда я хотел передать значение из back-end в angular приложение:

<div data-ng-controller="myCtrl" data-ng-init="init('%some_backend_value%')"></div>

Ответ 2

Попробуйте это?

$scope.$on('$viewContentLoaded', function() {
    //call it here
});

Ответ 3

Я никогда не мог получить $viewContentLoaded для работы для меня, и ng-init действительно должен использоваться только в ng-repeat (согласно документации), а также вызов функции непосредственно в контроллере может вызвать ошибки, если код опирается на элемент, который еще не определен.

Это то, что я делаю, и это работает для меня:

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

Если вы не используете ui-router. Тогда это:

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

Ответ 4

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

    // your code here

});

Ответ 5

Решение Dimitri's/Mark не работает для меня, но использование функции $timeout, похоже, хорошо работает, чтобы убедиться, что ваш код работает только после рендеринга разметки.

# Your controller, including $timeout

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

$timeout($scope.init)

Надеюсь, что это поможет.

Ответ 6

Вы можете сделать это, если хотите просмотреть объект DOM viewContentLoaded для изменения, а затем сделать что-то. используя $scope. $on работает тоже, но по-разному, особенно если у вас есть один режим страницы в вашей маршрутизации.

 $scope.$watch('$viewContentLoaded', function(){
    // do something
 });

Ответ 7

Вы можете использовать angular $window object:

$window.onload = function(e) {
  //your magic here
}

Ответ 8

Другая альтернатива:

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

(через fooobar.com/questions/19762/...)

Ответ 9

При использовании $routeProvider вы можете разрешить в .state и загружать свою службу. Это означает, что вы собираетесь загрузить Controller и View, только после решения вашей службы:

UI-маршруты

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

Сервис

function ourBootstrapService() {

 function init(){ 
    // this is what we need
 }
}

Ответ 10

Найден Дмитрий Евсеев ответил весьма полезный.

Случай 1: Использование только угловых:
Чтобы выполнить метод загрузки страницы, вы можете использовать ng-init в представлении и объявить метод init в контроллере, указав, что использование более тяжелой функции не рекомендуется, в соответствии с angular Документы в ng-init:

Эту директиву можно злоупотреблять, чтобы добавить ненужные количества логики в ваши шаблоны. Существует только несколько подходящих применений ngInit, например, для наложения специальных свойств ngRepeat, как показано в демонстрации ниже; и для ввода данных через серверные скрипты. Помимо этих нескольких случаев, вы должны использовать контроллеры вместо ngInit для инициализации значений в области.

HTML:

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

Контроллер:

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

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

    doSearch($routeParams.searchKeyword);
})

Предупреждение:. Не используйте этот контроллер для другого представления, предназначенного для другого намерения, поскольку оно также приведет к тому, что метод поиска будет выполнен.

Случай 2: Использование Ionic:
Вышеприведенный код будет работать, просто убедитесь, что кеш просмотра отключен в route.js как:

route.js

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

Надеюсь, что это поможет

Ответ 11

У меня была такая же проблема, и только это решение работало для меня (он запускает функцию после загрузки полной DOM). Я использую это для прокрутки для привязки после загрузки страницы:

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

                        // Your function that runs after all DOM is loaded

                    });

Ответ 12

Еще одна альтернатива, если у вас есть контроллер, специфичный только для этой страницы:

(function(){
    //code to run
}());

Ответ 13

Вы можете сохранить результаты поиска в общей службе, которая может использоваться из любого места и не очищается при переходе на другую страницу. Затем вы можете установить результаты поиска с сохраненными данными для кнопки "Назад"

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

For your backbutton

function Backbutton(){
RetievedData=CommonFunctionalityService.retrieveResults();
}