WedX - журнал о программировании и компьютерных науках

Почему $http в ng-init не вызывается каждый раз при загрузке представления – AngularJS

Я изменил свой вопрос в соответствии с моим наблюдением. $http запрос на стороне сервера не происходит всякий раз, когда представление вызывается второй или третий или около того раз, хотя initWishList (ng-init) вызывается. Сценарий следующий:

У меня есть вкладка Мой аккаунт на панели навигации, которая открывает представление с такими параметрами, как «Мой список желаний», «Мой адрес» и т. д. При первом нажатии Мой список желаний $http запрос происходит, но когда я снова нажимаю Моя учетная запись (на этот раз я не вижу никакого вызова на стороне сервера при загрузке представления .html), а затем, если я нажимаю Мой список желаний , контроллер вызывается, но $http не вызывается (на этот раз я снова не вижу никакого вызова на стороне сервера от $http), но я вижу предупреждение Init Called

Почему так?

$scope.initWishList = function(){
    alert('Init called')
    $http.get("/get_wish_list/")
    .success(function (response) {
        $scope.refreshWishList(JSON.parse(response["products_json"]));
    })
    .error(function(){
        console.log('Error');
    });
};

Надеюсь, я правильно объяснил сценарий.


  • ng-init не следует использовать. почему вы не инициируете переменную в контроллере области видимости и не обновляете ее после? 21.12.2015
  • @AlainIb Хм, но почему он не вызывается при повторном нажатии на представление? 21.12.2015
  • Можете ли вы показать HTML вашего сценария? ng-init выполняется каждый раз, когда элемент, к которому он прикреплен, визуализируется и компилируется Angular, поэтому не имеет значения, получен ли шаблон с сервера или из кеша. 21.12.2015
  • @tasseKATT: я обновил свой вопрос. Посмотрите сейчас 21.12.2015
  • Этот код не помогает. Вам нужно показать HTML, где используется ng-init, и как он связан с панелью навигации и представлениями. 21.12.2015
  • Этой директивой можно злоупотреблять, чтобы добавить ненужное количество логики в ваши шаблоны. Есть только несколько подходящих применений ngInit, например, для псевдонимов специальных свойств ngRepeat, как показано в демонстрации ниже; и для ввода данных через сценарии на стороне сервера. Помимо этих нескольких случаев, вы должны использовать контроллеры, а не ngInit для инициализации значений в области видимости. - из документации ngInit AngularJS. 21.12.2015
  • @tasseKATT: я, конечно, могу вставить свой html-код, но все работает нормально. Я имею в виду, что даже ng-init вызывается правильно, и я могу видеть предупреждения. Просто вызов $http (который находится внутри ng-init) не запускается. Вы все еще хотите, чтобы я поставил код html? После этого он будет выглядеть грязно :( 21.12.2015
  • @JonK: Даже когда я удалил ng-init и вызвал эту функцию через `$scope.initWishList();`, я все еще не могу увидеть вызов $http на стороне сервера 21.12.2015
  • Нет необходимости в HTML, если ng-init больше не проблема :) 21.12.2015
  • Откройте вкладку сети в Chrome DevTools, а затем дважды вызовите initWishList. Вы должны увидеть, получен ли второй вызов из кеша. 21.12.2015
  • @tasseKATT: Потрясающе. Видел из файрфокса. Столбец /get_wish_list Перенесено отображается как cached. Спасибо 21.12.2015
  • @tasseKATT: Хотя я занимался проблемой кеша, мне интересно, почему он включен по умолчанию? Я имею в виду, не следует ли отключать это в случае вызовов $http, поскольку он собирал старые данные 23.12.2015
  • Когда вы видите вызов в инструментах разработчика Firefox/Chrome с надписью cached, это не имеет ничего общего с Angular. Это браузер, который кэшировал запрос. Если вы кешируете результаты с помощью Angular, следующий вызов $http будет извлекать результат из объекта в памяти, и в инструментах разработчика не будет видимого вызова. Не уверен, объясняет ли это ваш вопрос или нет :) 23.12.2015

Ответы:


1

Контроллеры инициализируются только один раз, когда angular анализирует директиву ng-controller. Поскольку контроллер инициализируется один раз, ng-init также будет запущен один раз.

Для вашего удобства добавьте точку останова в свой контроллер в первой строке, чтобы увидеть, когда вы нажмете эту точку останова. Вы нажимаете эту точку останова каждый раз, когда нажимаете на вкладку? Если нет, ng-init не будет вызываться каждый раз

21.12.2015
  • Я обновил свой вопрос некоторыми новыми выводами. Пожалуйста, проверьте сейчас 21.12.2015
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]