考虑以下 ui-router 配置:

$stateProvider
  .state('app', {
    url: "/app",
    abstract: true,
    templateUrl: "templates/menu.html",
    controller: 'AppCtrl'
  })
  .state('app.feed', {
    url: "/feed",
    views: {
      'menuContent': {
        templateUrl: "templates/feed.html",
        controller: "FeedCtrl"
      }
    }
  })

我的应用程序中有以下链接:

<a ui-sref="app.feed({ feedId: 5 })">My Link</a>

我正在尝试获取 feedId 在状态参数中:

angular.module('MyApp').controller('FeedCtrl', function($state) {
  console.log($state.params);
});

但不幸的是, $state.params 总是 {}.

我究竟做错了什么?

额外问题

我预计 FeedCtrl 每次点击链接时都会初始化,即每次状态更改为 app.feed. 。所以,如果我改变 app.feed 状态和其他状态多次,我期望 console.log 上面运行多次。但是,它看起来像 ui-router 初始化 FeedCtrl 只有一次。为什么?

有帮助吗?

解决方案

要传递参数 - 我们必须定义它:

 .state('app.feed', {
    url: "/feed/{feedId}",
    views: {
      'menuContent': {
        templateUrl: "templates/feed.html",
        controller: "FeedCtrl"
      }
    }

在这种情况下,我们将其定义为 {feedId}

在这里查看更多内容

一些例子:

  • '/user/{id:[^/]*}' - 与...一样 '/user/{id}' 从前面的例子来看。
  • '/user/{id:[0-9a-fA-F]{1,8}}' - 与前面的示例类似,但仅当 id 参数包含 1 到 8 个十六进制数字时才匹配。
  • '/files/{path:.*}' - 匹配以“/files/”开头的任何 URL,并将路径的其余部分捕获到参数“path”中。
  • '/files/*path' - 同上。catch all 的特殊语法。

如果我们确实定义了参数,我们将在不同的状态之间导航 feedId 价值观...我们真的会看到那个控制器 FeedCtrl 被重新实例化。就是这样的 ui-router 被设计

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top