1

Я борется с созданием системы, позволяющей извлекать и открывать статьи в модальном всплывающем окне. Он был успешно реализован с использованием Bootstrap modal, но из-за некоторых новых требований мне нужно преобразовать в использование UUL Modal.Угловой интерфейс Модальные причины Бесконечный дайджест Loop

Я думаю, что проблема связана с моей обработкой URL-адресов с помощью параметра $ location.search() Angular, но я не могу его точно определить.

С момента добавления вызова $ uibModal.open() этот бесконечный цикл дайджеста возникает всякий раз, когда я нажимаю на статью, это запускает функцию openModal в моем контроллере.

Я включу свой код контроллера и сообщение об ошибке, которое я получу ниже. Две точки входа в контроллер находятся около дна в $ rootScope. $ On и $ scope. $ Watch calls. Они позволяют модальному реагировать на изменения в URL-адресе.

Конечной целью является возможность открытия Углового пользовательского интерфейса при изменении URL-адреса, поэтому я могу удалить параметры URL-адреса, когда модаль отклонен.

Спасибо за помощь!

Мой контроллер:

(function() { 
    'use strict'; 

    //Create the LinkModalController and bind it to the core app. This makes it always available. 
    angular 
     .module('app.core') 
     .controller('LinkModalController', LinkModalController); 

    LinkModalController.$inject = ['$location', '$q', '$rootScope', '$scope', '$uibModal', 'contentpartservice', 'logger']; 
    /* @ngInject */ 

    function LinkModalController($location, $q, $rootScope, $scope, $uibModal, contentpartservice, logger) { 
     var vm = this; 

     /*--------------Variable Definitions--------------*/ 
     vm.modalData = {}; 
     vm.isModalLoading = true; 
     vm.selectedTab; 
     vm.urlHistory; 

     /*--------------Function Definitions--------------*/ 
     vm.selectTab = selectTab; 
     vm.openModal = openModal; 

     /*Activate Controller*/ 
     activate(); 

     /*--------------Functions--------------*/ 
     /*Announcement clicks are handled separately because the announcement data contains the full article*/ 
     function handleAnnouncementClick(data) { 
      vm.modalData = data; 
      $("#announcementModal").modal(); 
      return; 
     } 

     /*Set the active tab for the open modal*/ 
     function selectTab(tab) { 
      vm.selectedTab = tab; 
      return; 
     } 

     /*Clicking an article of any content type should be funneled through this function. Eventually to be merged with handleSearchResultClick*/ 
     function handleContentTypeClick(data) { 
      setUrl(data.id, data.contentType.value); 
      return; 
     } 

     function handleUrlParamsModalLaunch(data) { 
      console.log('launching modal'); 
      /*Ensure modal is not displaying any data*/ 
      vm.modalData = {}; 
      vm.selectedTab = null; 

      /*Show modal loading screen*/ 
      vm.isModalLoading = true; 
      var modalInstance = $uibModal.open({ 
       templateUrl: 'app/modals/contentTypeModalTemplate.html', 
       controller: 'LinkModalController as vm', 
      }); 

      /*Call the content service to return the clicked content article*/ 
      contentpartservice.getContentItem(data.id, data.type).then(function (contentItem) { 
       if (contentItem) { 
        vm.isModalLoading = false; 
        vm.modalData = contentItem; 
        return; 
       } else { 
        closeModal("#contentPartModal").then(function() { 
         vm.isModalLoading = false; 
         logger.error('An error occurred while fetching content'); 
        }); 
        return; 
       } 
      }, function (error) { 
       closeModal("#contentPartModal").then(function() { 
        vm.isModalLoading = false; 
        logger.error('An error occurred while fetching content'); 
       }); 
       return; 
      }); 
     } 

     /*Close a modal and return a promise object - This allows other code to be executed only after the modal closes*/ 
     function closeModal(modalId) { 
      $(modalId).modal('hide'); 

      var defer = $q.defer(); 
      defer.resolve(); 

      return defer.promise; 
     } 

     //Function to append information to the URL required to retrieve the displayed article 
     function setUrl(contentId, contentType) { 
      var urlParams = $location.search(); 

      if (urlParams.q) { 
       $location.search({ q: urlParams.q, type: contentType, id: contentId }); 
      } else { 
       $location.search({ type: contentType, id: contentId }); 
      } 

      console.log($location.search()); 
      return; 
     } 

     /*Route link click calls to handle different data structures*/ 
     function openModal(data, context) { 
      switch (context) { 
       case 'urlParams': 
        handleUrlParamsModalLaunch(data); 
        break; 
       case 'announcement': 
        handleAnnouncementClick(data); 
        break; 
       case 'contentType': 
        handleContentTypeClick(data); 
        break; 
       default: 
        logger.error('An error occurred while fetching content'); 
      } 

      return; 
     } 

     /*--------------Listeners--------------*/ 

     /*Catch links click events broadcast from the $rootScope (shell.controller.js)*/ 
     $rootScope.$on('openModal', function (event, data, context) { 
      vm.openModal(data, context); 
      return; 
     }); 

     /*--------------Activate Controller--------------*/ 
     function activate() { 
      /*Create a watcher to detect changes to the URL*/ 
      $scope.$watch(function() { return $location.search() }, function() { 
       alert('url changed'); 
       /*Wait for modals to render*/ 
       var urlParams = $location.search(); 

       if (urlParams.type && urlParams.id) { 
        vm.openModal(urlParams, 'urlParams'); 
       } 

       /*Handle the inital page load. (Must wait until content is loaded to open modal). This code only runs once.*/ 
       $rootScope.$on('$includeContentLoaded', function() { 
        alert('url changed first laod'); 
        /*Wait for modals to render*/ 
        var urlParams = $location.search(); 

        if (urlParams.type && urlParams.id) { 
         vm.openModal(urlParams, 'urlParams'); 
        } 
       }); 
      }, true); 
     } 
    } 
})(); 

Сообщение об ошибке было зарегистрировано массивный блок текста, поэтому я вставил его в документ Google: https://docs.google.com/document/d/1esqZSMK4_Tiqckm-IjObqTvMGre2Ls-DWrIycvW5CKY/edit?usp=sharing

+0

'$ (" # contentPartModal "). Modal();' - это проблема (возможно, одна из них). Вы не должны использовать jQuery, как это. – dfsq

+0

@dfsq Извините, функция, в которой вы видели этот код, была частью старой реализации и больше не используется. Я отредактировал сообщение, чтобы отразить это. Благодаря! –

ответ

0

не знаю, если у вас есть попробовал $locationProvider.html5Mode(true); в конфигурационном модуле вашего приложения. Если вы используете jquery-модель, чтобы открыть всплывающее окно, это может иметь конфликт между угловыми и jquery, потому что jquery также отслеживает изменение на URL-адресе. У меня были похожие проблемы.