Звичайні посилання Angularjs з html5Mode


76

Я працюю з angularjs в режимі html 5. Що, здається, бере на себе контроль над усіма href-файлами на сторінці. Але що, якщо я хочу мати посилання на щось у тому самому домені програми, але насправді не в додатку. Прикладом може бути pdf.

Якщо я виконую <a href="https://stackoverflow.com/pdfurl">angular, я просто спробую використовувати html5mode і використовувати постачальника маршрутів, щоб визначити, який вигляд слід завантажити. Але я насправді хочу, щоб браузер переходив на цю сторінку звичайним способом.

Єдиний спосіб це зробити - це скласти правило з провайдером маршруту і переспрямувати на правильну сторінку з window.location?

Відповіді:


148

в режимі HTML5 є три ситуації, коли тег A не переписується: з кутових документів

  • Посилання, що містять targetатрибут. Приклад:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • Абсолютні посилання, що вказують на інший домен Example: <a href="http://angularjs.org/">link</a>
  • Посилання, що починаються на '/', що ведуть до іншого базового шляху, коли baseвін визначенийExample: <a href="https://stackoverflow.com/not-my-base/link">link</a>

так що ваш випадок буде 1. додати target="_self"


Яке дивне виправлення, але велике спасибі! Я думаю, що Angular повинен надати
кращий

1
це не виправлення. причина в тому, що Aце обробляється як директива.
Едуард Гамонал

34

Починаючи з Angular v1.3.0, є нова rewriteLinksопція конфігурації для постачальника місцезнаходження. Це вимикає "викрадення" всіх посилань на сторінці:

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

Хоча вимкнення такої поведінки для всіх посилань може бути не вашим наміром, я публікую це для інших, хто, як і я, хоче використовувати $locationв режимі html5 лише для зміни URL-адреси, не впливаючи на всі посилання.


6

Якщо ви не хочете, щоб Angular взяв контроль над href. Розмістіть цільовий атрибут на посиланні.

Отже, PDF буде передавати html5mode і routeProvider, а браузер просто перейде на цю URL-адресу.


3

Інше рішення. Всі посилання працюватимуть нормально (перезавантажити сторінку). Посилання, позначені позначкою, ng-href="https://stackoverflow.com/path"будуть відтворюватися на pushState. Невеликий хак-хакер з цим допоможе.

.config(["$locationProvider", function($locationProvider) {
    // hack for html5Mode customization
    $('a').each(function(){
        $a = $(this);
        if ($a.is('[target]') || $a.is('[ng-href]')){
        } else {
            $a.attr('target', '_self');
        }
    });

    $locationProvider.html5Mode(true);
}])

1
+1. Відповідь Едуарда Гамонала є найповнішою, але це, безумовно, здається великою варіацією використання цільового тегу і особливо стосується ситуації, в якій перебуває моя команда, коли ми плануємо ввести загальний заголовок, який підтримує інша команда.
Дерек Грір

3
Оскільки це .config, чи не можна це запустити лише один раз? Тобто, якщо у вас є кілька віртуальних сторінок із вмістом, здається, що це буде сканувати лише ті записи, які зараз перебувають у DOM, а не те, що можна отримати пізніше як частину шляху URL.
райман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.