如何/何时使用ng-click来呼叫路由?

Rob*_*ian 243 routes angularjs angularjs-routing angularjs-ng-click angularjs-ng-route

假设您正在使用路线:

// 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'
    });
...
Run Code Online (Sandbox Code Playgroud)

在您的html中,您希望在单击按钮时导航到about页面.一种方法是

<a href="#/about">
Run Code Online (Sandbox Code Playgroud)

...但似乎ng-click在这里也很有用.

  1. 这个假设是否正确?使用ng-click而不是锚点?
  2. 如果是这样,那将如何运作?IE:

<div ng-click="/about">

Jos*_*ler 430

路由监视$location服务并响应URL中的更改(通常通过哈希).要"激活"路线,只需更改URL即可.最简单的方法是使用锚标签.

<a href="#/home">Go Home</a>
<a href="#/about">Go to About</a>
Run Code Online (Sandbox Code Playgroud)

没有比这更复杂的了.但是,如果您必须通过代码执行此操作,则正确的方法是使用该$location服务:

$scope.go = function ( path ) {
  $location.path( path );
};
Run Code Online (Sandbox Code Playgroud)

例如,按钮可以触发:

<button ng-click="go('/home')"></button>
Run Code Online (Sandbox Code Playgroud)

  • 这个对我不起作用,但是通过替换$ location.hash(hash); with $ location.path(hash); 有用.这是由@sean在另一个回复中提出的,由于某种原因,该回复的票数要少得多. (6认同)
  • @BennettMcElwee我认为到目前为止最好的方法是使用锚标签; 在这种情况下,按钮标记不提供任何值,而是创建问题的原因.也就是说,您可以轻松创建一个指令来为您执行此操作,例如:`<button click-go ="/ home">单击</ button>`.链接函数只有这样:`element.on("click",function(){$ location.path(attrs.clickGo);});` (3认同)
  • @PerQuestedAronsson`path`和`hash`有两种不同的用途,但根据情况可以产生相同的效果.对于大多数情况,对于严格的路由(特别是启用`html5mode`),`path`将是规范的选择.我更新了答案以反映这一点. (2认同)
  • @DavidWoods应该可以工作,但前提是基本路径匹配`/`.如果您从`/ app/index.html`提供应用程序,那么这将无效,因为绝对URL是`/ app/next.html`.显然,服务器必须设置为在`/ next.html`时返回你的`index.html`文件.如果你想让我看看,请随意张贴一个Plunker/Fiddle. (2认同)
  • 这是一个非常通用和有用的事情.有没有办法集中它,还是我们真的必须为每个控制器添加一个`go`方法?(或者用`go`方法创建一个根控制器?) (2认同)

小智 82

这是一个没人提到的好建议.在函数所在的控制器中,您需要包含位置提供程序:

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>
Run Code Online (Sandbox Code Playgroud)

  • 这是此页面上唯一实际有效的建议解决方案.不知道为什么另一个答案比这个答案有更多的选票..? (8认同)
  • 很感谢!这个答案对我来说效果更好,因为哈希方法将值附加到url(编码)上,路径方法让我替换完整的url,这就是我需要的.谢谢! (2认同)

Ben*_*wee 33

使用自定义属性(使用指令实现)可能是最干净的方法.这是我的版本,基于@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);
                });
            });
        }
    }
}]);
Run Code Online (Sandbox Code Playgroud)

它有一些有用的功能,但我是Angular的新手,所以可能还有改进的余地.