href замінює ng-клацання в Angular.js


118

Коли визначені атрибути href та ng-click:

<a href="#" ng-click="logout()">Sign out</a>

hrefатрибут має пріоритет над нг клацанням.

Я шукаю спосіб підвищити пріоритет ng-клацання.

href потрібен для Twitter Bootstrap, я не можу його видалити.


Не могли б ви детальніше розглянути питання про те, що "href потрібен для завантаження у Twitter"? Яка його частина? CSS або JavaScript?
pkozlowski.opensource

Навчальний віджет "Twitter Bootstrap nav" налаштований на використання посилань, якщо ви додасте до нього кнопку, навіть ту, яка створена так, щоб виглядати як посилання, вона порушує стилізацію навігації. Це, мабуть, не семантичний HTML, але рішення @ sketchfemme робить те, що я (і, можливо, Павло) хочу, щоб це зробити.
BenCr

Ігноруйте все, що я сказав, navbar прекрасно працює з кнопками, якщо ви використовуєте правильний HTML та класи. getbootstrap.com/components/#navbar
BenCr

Ви повинні прийняти відповідь Мітху, яка має використовувати порожню URL
Пітер Морріс

1
@Paul Оригінальний плакат запитав, як отримати <a href>, щоб не орієнтуватися. Прийнята відповідь говорить про перехід на кнопку. Хоча це працює, це не є вирішенням проблеми, особливо, якщо, як і я, ви змушені використовувати <a href>, тому що це меню завантаження чи щось таке. Правильне рішення цього конкретного питання - використовувати порожній URL <a href="" ng-click="wwhat()"> Вийти </a> - я перевірив його і можу підтвердити, що він працює. На щастя, хтось інший дав правильну відповідь, або я все одно застряг.
Пітер Морріс

Відповіді:


35

Ймовірно, вам слід просто скористатися тегом кнопок, якщо вам не потрібен урій.


Так, якщо ви можете детальніше пояснити, як цього вимагає Twitter Bootstrap, можливо, я можу допомогти більше.
Джефф

Як це працює з пошуковими системами? Я використовую маршрутизацію AngularJS і мені потрібно підтримувати стан в сервісі, тому для всіх моїх внутрішніх посилань на додаток я використовую $ location, але видалення href унеможливлює пошук пошукових систем уздовж сайту.
Даррррррен

2
кнопки не можуть мати іншого елемента всередині себе, тому для стилізації ви не хочете цього робити - якщо вам потрібні речі всередині нього.
шерифдерек

246

Цей приклад із сайту кутової документації просто робить, hrefнавіть не призначаючи його порожній рядку:

[<a href ng-click="colors.splice($index, 1)">X</a>]

http://docs.angularjs.org/api/ng.directive:select


3
Коли я це намагаюся, всі посилання, як видається, переглядаються, і це не поведінка, яку я переслідую. Інший спосіб ( href="#") викликає перезавантаження сторінки, що також неправильно.
Rhys van der Waerden

4
Це робить IE9 не показувати курсор руки. Використовуючи href=""вирішує це.
Juampy NR

1
@juampy, передача посилання може оброблятися за допомогою CSS. Ця відповідь є офіційним способом AngularJS зробити це.
thenetimp

# Буде оброблятися як хеш-посилання.
шерифдерек

3
<a href="javscript:void(0)" ng-click="logout()">Sign out</a>буде служити і вам
Маріос Факіолас

88

Ви можете просто попередити поведінку події клацання за замовчуванням безпосередньо у вашому шаблоні.

<a href="#" ng-click="$event.preventDefault();logout()" />

За кутовою документацією ,

Такі директиви, як ngClick і ngFocus, виставляють об'єкт $ події в межах цього виразу.


11
Це чудове рішення. Якщо у вас є href, ви можете клацнути правою кнопкою миші, щоб відкрити його на новій вкладці, але лівою кнопкою миші викликає ng-click. Саме те, що я шукав
Том Грант

Ще раз відмінна відповідь. Працюють як лівий, так і правий клацання
Jay Jay Jay

Відмінно працював, що дозволяло контролювати карусель Bootstrap без ініціювання маршрутизації. Дякую!
Джейсон Маггард

Ідеально! Я можу продовжувати посилання та отримувати більше індексу в Google та використовувати ng-click для дзвінка в Ajax. Дякую.
Гільгерме ІА

Прекрасне рішення, швидке та корисне. Дякую!
Джозуе Роша

72

Ось ще одне рішення:

<a href="" ng-click="logout()">Sign out</a>

тобто просто видаліть # з атрибута href


1
Для поставленого питання це має бути рішенням. Працював і на Angular 1.1.5
Sindre

18
Здається, <a href="" ng-click=""> запобіжить натискання ng у браузері Android 2.3.x. Я нарешті використовую <a href="javascript:void(0)" ng-click="">
duckegg

1
Пропозиція Duckegg - найкраща
Jiří Vypědřík

26

Ще один натяк. Якщо вам потрібна реальна URL-адреса (для підтримки доступності браузера), ви можете зробити наступне:

шаблон:

<a ng-href="{{link}}" ng-click="$event.preventDefault(); linkClicked(link)">{{link}}</a>

директива:

$scope.linkClicked = function(link){
    // your code here
    $location.path(link);
};

Таким чином ваш код у linkClicked () матиме шанс виконати його, перш ніж перейти до посилання


Це рішення працює і змінює лише поведінку клацання лівою кнопкою миші, правою кнопкою миші залишається недоторканою (контекстне меню), включаючи можливість посилання в href. Тож це більш загальне рішення порівняно з TooMuchTenacious, яке насправді відповідає на питання більш прямо.
Exocom

21

В Angular, <a>s - директиви . Таким чином, якщо у вас порожній hrefабо ні href, Angular зателефонує event.preventDefault.

З джерела :

    element.on('click', function(event){
      // if we have no href url, then don't navigate anywhere.
      if (!element.attr(href)) {
        event.preventDefault();
      }
    });

Ось плнкр, який демонструє відсутній hrefсценарій.


13

Це працювало для мене в IE 9 та AngularJS v1.0.7:

<a href="javascript:void(0)" ng-click="logout()">Logout</a>

Дякуємо коментарю duckeggs за робоче рішення!


Працює, посилання не змінює ваш URL-адрес і не позначається як відвідане. Найкраща відповідь!
Jim109

10

Тут настільки багато відповідей на це питання, але, здається, є дещо плутанини щодо того, що відбувається насправді.

По-перше, ваше приміщення

"href переосмислює ng-клацання в Angular.js"

неправильно. Насправді відбувається те, що після вашого клацання подія клацання спочатку обробляється кутовим (визначеним ng-clickдирективою у кутовій 1.х та clickу кутовій 2.х +), а потім продовжує розповсюджуватись (що врешті-решт запускає браузер переходити до URL, визначений hrefатрибутом). (Дивіться це для отримання додаткової інформації про розповсюдження подій у javascript)

Якщо ви хочете цього уникнути, вам слід скасувати поширення події, використовуючи метод інтерфейсу EventpreventDefault() :

<a href="#" ng-click="$event.preventDefault();logout()" />

(Це чисто функціональність javascript і нічого спільного з кутовим)

Тепер це вже вирішить вашу проблему, але це не оптимальне рішення. Кутовий, по праву, просуває модель MVC . З цим рішенням ваш HTML-шаблон змішується з логікою javascript. Вам слід спробувати максимально уникнути цього і ввести свою логіку у свій кутовий контролер. Тож кращий спосіб був би

<a href="#" ng-click="logout($event)" />

І у вашому способі logout ():

logout($event) {
   $event.preventDefault();
   ...
}

Тепер подія клацання не дійде до браузера, тому він не намагатиметься завантажити посилання, на яке вказує href. (Однак зауважте, що якщо користувач правою кнопкою миші натискає посилання та безпосередньо відкриває посилання, то подія клацання взагалі не буде. Натомість вона безпосередньо завантажить URL, вказаний hrefатрибутом.)

Щодо коментарів щодо відвіданого кольору посилань у веб-переглядачах. Знову ж це не має нічого спільного з кутовим, якщо ваші href="..."вказівки на відвідуваний URL-адресою браузера за замовчуванням колір посилання буде іншим. Це контролюється CSS: відвідавши Selector , ви можете змінити свій css, щоб замінити цю поведінку:

a {
   color:pink;
}

PS1 :

Деякі відповіді пропонують використовувати:

<a href .../>

href- кутова директива. Коли ваш шаблон буде оброблений кутовим, він буде перетворений

<a href="" .../>

Ці два способи по суті однакові.


5

Просто напишіть ng-click перед href .. Це працювало на мене

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@1.5.0" data-semver="1.5.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
    <script>
    angular.module("module",[])
.controller("controller",function($scope){
  
  $scope.func =function(){
    console.log("d");
  }
  
})</script>
  </head>

  <body ng-app="module" ng-controller="controller">
    <h1>Hello ..</h1>
    <a ng-click="func()" href="someplace.html">Take me there</a>
  </body>

</html>


2

Я не думаю, що вам потрібно видаляти "#" з href. Наступні роботи з Angularjs 1.2.10

<a href="#/" ng-click="logout()">Logout</a>

1

Ви також можете спробувати це:

<div ng-init="myVar = 'www.thesoftdesign'">
        <h1>Tutorials</h1>
        <p>Go to <a ng-href="{{myVar}}">{{myVar}}</a> to learn!</p>
</div>

0

Я додам для вас приклад, який працює для мене, і ви можете змінити його, як хочете.

Я додаю наступний код всередині свого контролера.

     $scope.showNumberFct = function(){
        alert("Work!!!!");
     }

а для моєї сторінки перегляду я додаю наступний код.

<a  href="" ng-model="showNumber" ng-click="showNumberFct()" ng-init="showNumber = false" >Click Me!!!</a>

0

Ви спробували перенаправити всередину функції виходу? Наприклад, скажімо, що ваша функція виходу така

$scope.logout = function()
{
  $scope.userSession = undefined;
  window.location = "http://www.yoursite.com/#"
}

Тоді можна просто мати

<a ng-click="logout()">Sign out</a>


0
//for dynamic elements - if you want it in ng-repeat do below code

angular.forEach($scope.data, function(value, key) {
     //add new value to object
    value.new_url  = "your url";
});

 <div ng-repeat="row in data"><a ng-href="{{ row.url_content }}"></a></div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.