Как / когда использовать ng-click для вызова маршрута?
Предположим, вы используете маршруты:
// bootstrap
myApp.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
$routeProvider.when('/home', {
templateUrl: 'partials/home.html',
controller: 'HomeCtrl'
});
$routeProvider.when('/about', {
templateUrl: 'partials/about.html',
controller: 'AboutCtrl'
});
...
и в вашем html, вы хотите перейти на страницу о программе при нажатии кнопки. Один из способов будет
<a href="#/about">
... но, похоже, ng-click будет полезен и здесь.
- правильно ли это предположение? Что ng-click будет использоваться вместо якоря?
- если да, то как это будет работать? Т. е.:
<div ng-click="/about">
8 ответов:
маршруты, отслеживать
$location
сервис и реагировать на изменения в URL (как правило, через хэш). Чтобы "активировать" маршрут, вы просто измените URL-адрес. Самый простой способ сделать это с помощью тегов привязки.<a href="#/home">Go Home</a> <a href="#/about">Go to About</a>
ничего более сложного не требуется. Если, однако, вы должны сделать это из кода, правильный способ заключается в использовании
$location
сервис:$scope.go = function ( path ) { $location.path( path ); };
который, например, кнопка может вызвать:
<button ng-click="go('/home')"></button>
вот отличный совет, который никто не упомянул. В контроллере, в котором находится функция, необходимо включить поставщика местоположения:
app.controller('SlideController', ['$scope', '$location',function($scope, $location){ $scope.goNext = function (hash) { $location.path(hash); } ;]); <!--the code to call it from within the partial:---> <div ng-click='goNext("/page2")'>next page</div>
использование пользовательского атрибута (реализованного с помощью директивы), пожалуй, самый чистый способ. Вот моя версия, основанная на предложениях @Josh и @sean.
angular.module('mymodule', []) // Click to navigate // similar to <a href="#/partial"> but hash is not required, // e.g. <div click-link="/partial"> .directive('clickLink', ['$location', function($location) { return { link: function(scope, element, attrs) { element.on('click', function() { scope.$apply(function() { $location.path(attrs.clickLink); }); }); } } }]);
у него есть некоторые полезные функции, но я новичок в Angular, поэтому, вероятно, есть место для улучшения.
помните, что если вы используете ng-click для маршрутизации, вы не сможете щелкнуть правой кнопкой мыши элемент и выбрать "Открыть в новой вкладке" или ctrl, щелкнув ссылку. Я пытаюсь использовать ng-href, когда речь заходит о навигации. ng-click лучше использовать на кнопках для операций или визуальных эффектов, таких как коллапс. Но О Я бы не рекомендовал. Если вы измените маршрут, вам может потребоваться изменить много размещенных в приложении. Есть метод, возвращающий ссылку. бывший: О. Этот метод в утилита
Я
ng-click
директива для вызова функции, запрашивая маршрут templateUrl, чтобы решить, какой<div>
должен бытьshow
илиhide
внутри страницы шаблона маршрута или для разных сценариев.
AngularJS 1.6.9
давайте посмотрим пример, когда на странице маршрутизации мне нужно либо добавить
<div>
или редактировать<div>
, который я контролирую с помощью родительских моделей контроллера$scope.addProduct
и$scope.editProduct
логический.RoutingTesting.HTML-код
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Testing</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-route.min.js"></script> <script> var app = angular.module("MyApp", ["ngRoute"]); app.config(function($routeProvider){ $routeProvider .when("/TestingPage", { templateUrl: "TestingPage.html" }); }); app.controller("HomeController", function($scope, $location){ $scope.init = function(){ $scope.addProduct = false; $scope.editProduct = false; } $scope.productOperation = function(operationType, productId){ $scope.addProduct = false; $scope.editProduct = false; if(operationType === "add"){ $scope.addProduct = true; console.log("Add productOperation requested..."); }else if(operationType === "edit"){ $scope.editProduct = true; console.log("Edit productOperation requested : " + productId); } //*************** VERY IMPORTANT NOTE *************** //comment this $location.path("..."); line, when using <a> anchor tags, //only useful when <a> below given are commented, and using <input> controls $location.path("TestingPage"); }; }); </script> </head> <body ng-app="MyApp" ng-controller="HomeController"> <div ng-init="init()"> <!-- Either use <a>anchor tag or input type=button --> <!--<a href="#!TestingPage" ng-click="productOperation('add', -1)">Add Product</a>--> <!--<br><br>--> <!--<a href="#!TestingPage" ng-click="productOperation('edit', 10)">Edit Product</a>--> <input type="button" ng-click="productOperation('add', -1)" value="Add Product"/> <br><br> <input type="button" ng-click="productOperation('edit', 10)" value="Edit Product"/> <pre>addProduct : {{addProduct}}</pre> <pre>editProduct : {{editProduct}}</pre> <ng-view></ng-view> </div> </body> </html>
TestingPage.HTML-код
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .productOperation{ position:fixed; top: 50%; left: 50%; width:30em; height:18em; margin-left: -15em; /*set to a negative number 1/2 of your width*/ margin-top: -9em; /*set to a negative number 1/2 of your height*/ border: 1px solid #ccc; background: yellow; } </style> </head> <body> <div class="productOperation" > <div ng-show="addProduct"> <h2 >Add Product enabled</h2> </div> <div ng-show="editProduct"> <h2>Edit Product enabled</h2> </div> </div> </body> </html>
обе страницы -
RoutingTesting.html
(родитель),TestingPage.html
(страница маршрутизации) находятся в том же каталоге,надеюсь, что это поможет кому-то.
Вы можете использовать:
<a ng-href="#/about">About</a>
Если вы хотите какую-то динамическую переменную внутри href вы можете сделать так:
<a ng-href="{{link + 123}}">Link to 123</a>
здесь ссылке угловая область видимости переменной.
другое решение, но без использования ng-click, который по-прежнему работает даже для других тегов, чем
<a>
:<tr [routerLink]="['/about']">
таким образом, вы также можете передать параметры вашего маршрута:https://stackoverflow.com/a/40045556/838494
(Это мой первый день с углового. Нежная обратная связь приветствуется)