Внедрение сервисов в контроллер в определенных браузерах

#javascript #angularjs

#javascript #angularjs

Вопрос:

У меня есть контроллер, который использует $location сервис в angular, однако нам нужно использовать его только в режиме HTML5, если браузер не поддерживает history.pushstate , мы хотим исключить сервис из контроллера, чтобы он не переписывал URL /#/2016-17 -адрес и вместо этого не выполнял никакой маршрутизации. Однако, если вы вводите $location в контроллер, он автоматически маршрутизирует с использованием метода hashbang.

Код ниже для справки:

 function SearchAdvancedController($location) {
    $location.url("/", false);
}

function config($locationProvider) {
    $locationProvider.html5Mode({
     enabled: true,
     rewriteLinks: false,
     requireBase: false
    });
}
  

Есть идеи?

Спасибо, ребята.

Комментарии:

1. Angular в основном создан для SPA. Вы хотите перезагружать свое приложение каждый раз, если браузер не поддерживает history.pushstate ??

2. @SteevePitis Я не хочу, чтобы он что-либо делал, $location не является критической функцией, все, для чего он используется, — это изменение URL при поиске пользователя, что не является ключевой функцией в старых браузерах

Ответ №1:

Вы всегда должны вводить службу в свой контроллер, если только вам не нужно много if..else условий, которые проверяют, существует ли служба или нет. Самое простое, что нужно сделать, это определить свой собственный сервис для изменения URL-адресов и условно заставить его ничего не делать:

 module.service('MyLocation', function ($location) {
    this.url = function () {
        if (/* browser supports pushstate */) {
            $location.url.apply($location, arguments);
        }
    };
});

function SearchAdvancedController(MyLocation) {
    MyLocation.url('/', false);
}
  

Возможно, вы захотите поиграть с декораторами и для этой цели.

Комментарии:

1. Будет ли это применяться и при загрузке страницы?

2. Что именно означает?

3. $location все еще вводится?

4. Я только что попробовал это, и он все еще перенаправляется со страницы

5. Если ваш контроллер не запрашивает его, он его не получит…