Ошибка 404 время от времени возникает в модуле области umbraco с угловым

У меня есть проект Umbraco с разделом Area, настроенным с помощью Angular. Я использую плагины для интеграции области с использованием package.manifest следующим образом:

введите здесь описание изображения

В edit.controller.js у меня есть этот скрипт:

'use strict';

angular.module("umbraco")
   .controller('Administration.AdministrationTree.EditController', function administrationEditController($scope, $routeParams, $http) {
      //set a property on the scope equal to the current route id
      $scope.id = $routeParams.id;
      $scope.url = "";
      $scope.canShow = false;

      $scope.showIframe = function () {
         if ($scope.url === "") {
            return false;
         }

         return true;
      };

      $scope.canShow = false;

      if (!$scope.id) {
         return;
      }

      $http.get('/umbraco/backoffice/administration/CustomSection/GetUrl/?node=' + $scope.id)
         .success(function (data) {

            $scope.url = JSON.parse(data);
            $scope.canShow = $scope.url;
         });
   });

Когда я запускаю проект и нажимаю на любой узел в этой области, большую часть времени я получаю ошибку 404, как если бы страница не существовала. Я говорю «в большинстве случаев», потому что в 1 случае из 10 это работает и страница отображается.

Однако, если я поставлю точку останова в функции javascript ниже, нажму на любой узел и возобновлю выполнение javascript после того, как точка останова сработает, html-страница, связанная с узлом, отобразится правильно.

Кто-нибудь знает, почему, когда я ставлю точку останова, Umbraco или Angular могут разрешить страницу в 100% случаев, но не когда у меня нет точки останова в этой функции?

Спасибо


person Samuel    schedule 23.02.2018    source источник


Ответы (1)


Я действительно ненавижу отвечать на свои собственные вопросы, но после 2 недель без ответов и множества размышлений с моей стороны я наконец нашел решение этой проблемы.

То, что вызывало проблему синхронизации между Umbraco и Angular, было связано с запросом $http.get, который является асинхронным с Angular (я думаю, нет другого выбора), и после ответа сервера для получения действительного URL-адреса объект $scope не удалось связаться с Umbraco для перенаправления на действительный URL-адрес.

На моем контроллере asp.net MVC функция GetUrl пыталась получить действительный URL-адрес, выполняя запрос к базе данных, где я сохраняю структуру узлов, соответствующих дереву, отображаемому для пользователя. Это медленный процесс, и время, необходимое для ответа на HTTP-запрос на получение, в большинстве случаев было слишком большим.

Вот мое решение этой проблемы:

'use strict';

var myCompany = myCompany || {};
myCompany.myProject = myCompany.myProject || {};

myCompany.myProject.controller = (function (parent){
   parent.urls = {};

   function loadUrls () {
      $.get('/umbraco/backoffice/administration/CustomSection/GetUrls')
         .success(function (data) {
            parent.urls = data;
         });
   };

   loadUrls();

   return parent;
})({});

angular.module("umbraco")
   .controller('Administration.AdministrationTree.EditController', function administrationEditController($scope, $routeParams, $http) {
      //set a property on the scope equal to the current route id
      $scope.id = $routeParams.id;
      $scope.url = "";
      $scope.canShow = false;

      $scope.showIframe = function () {
         if ($scope.url === "") {
            return false;
         }

         return true;
      };

      $scope.canShow = false;

      if (!$scope.id) {
         return;
      }

      var url = myCompany.myProject.controller.urls.find(function (element) {
         return element.Key == $scope.id;
      });

      if (url) $scope.url = url.Value;

      $scope.canShow = $scope.url;
   });

Обратите внимание, что в этом случае у меня есть функция iffe, которая запрашивает сервер для создания массива всех моих URL-адресов из бэк-офиса, а затем, когда Angular требуется перенаправление, я ищу непосредственно из массива.

Функция iffe вызывается только один раз, когда пользователь входит в раздел бэк-офиса, что, на мой взгляд, хорошо, потому что структура редко меняется.

Я не уверен, что это хак или правильный способ сделать это из-за отсутствия у меня опыта работы с Angular, но он работает как шарм.

person Samuel    schedule 06.03.2018