href ghi đè ng-click trong Angular.js


118

Khi cả hai thuộc tính href và ng-click được xác định:

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

các hrefthuộc tính được ưu tiên hơn ng nhấp chuột.

Tôi đang tìm cách để tăng mức độ ưu tiên của ng-click.

href là bắt buộc cho Twitter Bootstrap, tôi không thể xóa nó.


Bạn có thể giải thích thêm về "href là bắt buộc cho Twitter Bootstrap" không? Phần nào của nó? CSS hay JavaScript?
pkozlowski.opensource

Twitter Bootstrap nav "widget" được thiết lập để sử dụng các liên kết, nếu bạn thêm một nút vào đó, ngay cả một nút được tạo kiểu để trông giống như một liên kết, nó sẽ phá vỡ kiểu điều hướng. Nó có thể không phải là HTML ngữ nghĩa nhưng giải pháp của @ sketchfemme thực hiện những gì tôi (và có thể là Paul) muốn nó làm.
BenCr

Bỏ qua mọi thứ tôi đã nói, navbar hoạt động hoàn hảo với các nút nếu bạn sử dụng đúng HTML và các lớp. getbootstrap.com/components/#navbar
BenCr

Bạn nên chấp nhận câu trả lời của Mithu, đó là sử dụng một URL trống
Peter Morris

1
@Paul Người đăng ban đầu đã hỏi cách lấy <a href> để không điều hướng. Câu trả lời được chấp nhận cho biết chuyển sang một nút. Mặc dù cách đó hoạt động nhưng nó không phải là giải pháp cho vấn đề, đặc biệt nếu giống như tôi, bạn buộc phải sử dụng <a href> vì đó là menu bootstrap hoặc một cái gì đó. Giải pháp chính xác cho câu hỏi cụ thể này là sử dụng url trống <a href="" ng-click="w Anything()"> Đăng xuất </a> - Tôi đã thử nghiệm và có thể xác nhận rằng nó hoạt động. Rất may có người khác đã cung cấp câu trả lời chính xác, nếu không tôi vẫn bị mắc kẹt.
Peter Morris

Câu trả lời:


35

Bạn có thể chỉ nên sử dụng thẻ nút nếu bạn không cần đi tiểu.


Có, nếu bạn có thể giải thích rõ hơn về cách Twitter Bootstrap yêu cầu nó, có lẽ tôi có thể giúp được nhiều hơn.
Geoff

Điều này hoạt động như thế nào với các công cụ tìm kiếm? Tôi đang sử dụng định tuyến AngularJS và cần duy trì trạng thái trong một dịch vụ nên đối với tất cả các liên kết ứng dụng nội bộ của mình, tôi sử dụng $ location, nhưng việc xóa href khiến các công cụ tìm kiếm không thể theo dõi trang web.
Darrrrrren

2
các nút không thể có phần tử khác bên trong chúng, vì vậy để tạo kiểu, bạn sẽ không muốn làm điều đó - nếu bạn cần những thứ bên trong nó.
sheriffderek

246

Ví dụ này từ trang web tài liệu góc chỉ làm hrefmà không cần gán nó vào một chuỗi trống:

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

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


3
Khi tôi thử điều này, tất cả các liên kết dường như đã được truy cập, đó không phải là hành vi mà tôi đang theo đuổi. Cách khác ( href="#") gây ra tải lại trang, điều này cũng sai.
Rhys van der Waerden

4
Điều này làm cho IE9 không hiển thị con trỏ tay. Sử dụng href=""giải quyết nó.
Juampy NR

1
@juampy, việc chuyển giao liên kết có thể được xử lý bằng CSS. Câu trả lời này được đưa ra là cách AngularJS chính thức để làm điều đó.
thenetimp

# Sẽ được coi như liên kết băm.
sheriffderek

3
<a href="javscript:void(0)" ng-click="logout()">Sign out</a>sẽ phục vụ bạn tốt quá
Marios Fakiolas

88

Bạn có thể chỉ cần ngăn chặn hành vi mặc định của sự kiện nhấp chuột trực tiếp trong mẫu của mình.

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

Theo tài liệu góc cạnh ,

Các lệnh như ngClick và ngFocus hiển thị một đối tượng $ event trong phạm vi của biểu thức đó.


11
Đây là một giải pháp tuyệt vời. Nếu bạn có một href, bạn có thể nhấp chuột phải để mở nó trong một tab mới, nhưng khi nhấp chuột trái, nó gọi là ng-click. Chính xác những gì tôi đang tìm kiếm
Tom Grant

Một lần nữa một câu trả lời xuất sắc. Cả hai công việc nhấp chuột trái và phải
Jay Jay Jay

Hoạt động hiệu quả khi cho phép điều khiển băng chuyền Bootstrap mà không cần kích hoạt định tuyến. Cảm ơn!
Jason Maggard,

Hoàn hảo! Tôi có thể tiếp tục với các liên kết và lấy thêm chỉ mục trong Google và sử dụng ng-click để gọi trong Ajax. Cảm ơn.
Guilherme IA

Giải pháp tuyệt vời, nhanh chóng và hữu ích. Cảm ơn!
Josue Rocha

72

Đây là một giải pháp khác:

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

tức là Chỉ cần xóa # khỏi thuộc tính href


1
Đối với câu hỏi được đặt ra, đây phải là giải pháp. Làm việc trên góc 1.1.5 cũng
Sindre

18
Có vẻ như <a href="" ng-click=""> sẽ ngăn ng-click trong trình duyệt Android 2.3.x. Cuối cùng thì tôi cũng sử dụng <a href="javascript:void(0)" ng-click="">
duckegg

1
Đề nghị Duckegg là một trong những tốt nhất
Jiří Vypědřík

26

Chỉ một gợi ý nữa. Nếu bạn cần URL thực (để hỗ trợ khả năng truy cập của trình duyệt), bạn có thể làm như sau:

bản mẫu:

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

chỉ thị:

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

Bằng cách này, mã của bạn trong linkClicked () sẽ có cơ hội thực thi trước khi điều hướng đến liên kết


Giải pháp này hoạt động và chỉ thay đổi hành vi nhấp chuột trái, nhấp chuột phải vẫn giữ nguyên (menu ngữ cảnh), bao gồm khả năng đến một liên kết trong href. Vì vậy, đó là một giải pháp tổng quát hơn so với TooMuchTenacious, giải pháp thực sự trả lời câu hỏi trực tiếp hơn.
Exocom

21

Trong Angular, <a>s là các chỉ thị . Như vậy, nếu bạn có trống hrefhoặc không href, Angular sẽ gọi event.preventDefault.

Từ nguồn :

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

Đây là một plnkr chứng minh hrefkịch bản mất tích .


13

Điều này đã làm việc cho tôi trong IE 9 và AngularJS v1.0.7:

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

Cảm ơn bình luận của duckeggs cho giải pháp làm việc!


Hoạt động, liên kết không thay đổi url của bạn và không được đánh dấu là đã truy cập. Câu trả lời tốt nhất!
Jim109,

10

Có rất nhiều câu trả lời cho câu hỏi này ở đây nhưng có vẻ như có một chút nhầm lẫn về những gì thực sự đang diễn ra ở đây.

Thứ nhất, tiền đề của bạn

"href ghi đè ng-click trong Angular.js"

sai. Điều thực sự đang xảy ra là sau lần nhấp của bạn, sự kiện nhấp chuột đầu tiên được xử lý bằng góc (được xác định bởi ng-clickchỉ thị trong góc 1.x và clicktrong góc 2.x +) và sau đó nó tiếp tục lan truyền (cuối cùng sẽ kích hoạt trình duyệt điều hướng đến url được xác định bằng hrefthuộc tính). (Xem phần này để biết thêm về truyền sự kiện trong javascript)

Nếu bạn muốn tránh điều này, thì bạn nên hủy truyền sự kiện bằng phương thức của giao diện Sự kiệnpreventDefault() :

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

(Đây là chức năng javascript thuần túy và không liên quan gì đến góc cạnh)

Bây giờ, điều này đã giải quyết được vấn đề của bạn nhưng đây không phải là giải pháp tối ưu. Angular, một cách đúng đắn, thúc đẩy mô hình MVC . Với giải pháp này, mẫu html của bạn được trộn với logic javascript. Bạn nên cố gắng tránh điều này càng nhiều càng tốt và đặt logic của bạn vào bộ điều khiển góc của bạn. Vì vậy, một cách tốt hơn sẽ là

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

Và trong phương thức logout () của bạn:

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

Bây giờ sự kiện nhấp chuột sẽ không đến trình duyệt, vì vậy nó sẽ không cố tải liên kết được trỏ đến href. (Tuy nhiên, lưu ý rằng nếu người dùng nhấp chuột phải vào liên kết và trực tiếp mở liên kết, thì sẽ không có sự kiện nhấp chuột nào cả. Thay vào đó, nó sẽ tải trực tiếp url được trỏ bởi hrefthuộc tính.)

Về nhận xét về màu liên kết đã truy cập trong trình duyệt. Một lần nữa, điều này không liên quan gì đến góc cạnh, nếu bạn href="..."trỏ đến một url được truy cập bởi trình duyệt của bạn theo mặc định, màu liên kết sẽ khác. Điều này được kiểm soát bởi CSS: đã thăm Bộ chọn , bạn có thể sửa đổi css của mình để ghi đè hành vi này:

a {
   color:pink;
}

PS1 :

Một số câu trả lời gợi ý sử dụng:

<a href .../>

hreflà một chỉ thị góc. Khi mẫu của bạn được xử lý theo góc, nó sẽ được chuyển đổi thành

<a href="" .../>

Hai cách đó về cơ bản là giống nhau.


5

Chỉ cần viết ng-click trước href .. Nó hoạt động với tôi

<!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

Tôi không nghĩ bạn cần xóa "#" khỏi href. Tiếp theo các hoạt động với Angularjs 1.2.10

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

1

Bạn cũng có thể thử điều này:

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

0

Tôi sẽ thêm cho bạn một ví dụ phù hợp với tôi và bạn có thể thay đổi nó theo ý muốn.

Tôi thêm mã dưới đây vào bên trong bộ điều khiển của mình.

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

và cho trang xem của tôi, tôi thêm mã dưới đây.

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

0

Bạn đã thử chuyển hướng bên trong chính chức năng đăng xuất chưa? Ví dụ: giả sử chức năng đăng xuất của bạn như sau

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

Sau đó, bạn chỉ có thể có

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

0

Làm ơn kiểm tra cái này

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

 $scope.logout = function(event)


 {
event.preventDefault();
alert("working..");
}

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.