【问题标题】:Angular / UI-Router: Accessing another state's controllerAngular / UI-Router:访问另一个状态的控制器
【发布时间】:2014-09-10 11:57:57
【问题描述】:

基本上,如何在 html 中访问未命名状态的控制器?我正在使用循环生成状态,包括我的 SPA 中的未命名控制器。尽管路由工作正常,主页 ng-include 了每个状态,但显然没有加载 /home 路由上的每个状态控制器。

这是我想要的示例,当我按预期导航到 /about 和 {{thisData}} = 'about Data' 时效果很好,但我希望 $scope 也位于具有 ng-include 的 /home 路由上.

<div ng-include="'views/about.html'" ng-controller="the about state's controller"></div>

在我的 app.js..

var routes, setRoutes;

routes = ['home','about','services','clients','articles','media','admin', '404'];

setRoutes = function(route) {
  var state, config;
  state = route;
  config = {
    url: '/' + route,
    templateUrl: 'views/' + route + '.html',
    controller: function($scope, $state){
      $scope.thisData = route + " Data";                
    }
  }
  $stateProvider.state(state, config);
  return $stateProvider;
};

routes.forEach(function(route) {
      console.log(route);
      return setRoutes(route);
  });

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    ui-routerng-includeng-controller 一起工作(按设计、有意)。这些是不同的概念。

    基本上,您的状态之一将在时间呈现。一个状态中可能有更多视图:

    或者它们可能存在层次结构 - 所以有一次我们可以看到一个孙状态('root.list.detail')及其所有祖先。

    这里指出了正确理解ui-router的所有基本资源:

    一旦我们定义了所有状态(如上面的问题),我们就可以开始创建链接以导航到这些状态:

    // using href
    <a href="#/home">home
    <a href="#/about">about
    // using ui-sref
    <a ui-sref="services">services
    <a ui-sref="clients">clients
    

    这些将被注入到定义 &lt;div ui-view=""&gt;&lt;/div&gt; 的 index.html(根文档)中。

    【讨论】:

    • 谢谢拉迪姆。这是一个内容丰富的回复,可能会帮助许多人更好地理解 ui-router。我同意你所说的一切,但是我仍然想要一种在应用程序的 SPA 部分(主页)上轻松访问各种状态控制器的方法。到目前为止,最流畅的解决方案是拥有一个服务,该服务采用各种控制器 $scope,然后可以与主页控制器同步。另一种选择是使用数据或解析属性,但如果可用,我正在寻找更内联的 html 答案。 (不诉诸垃圾 $rootScope)
    • 我想帮忙。但我想说的是,这最终不会奏效。 ui-router 代表不同的世界/方法。您仍然可以创建命名控制器,重复状态数组并调用.controller(stateName + 'Ctrl', function...)。然后你将该名称传递给状态定义...但是状态视图和控制器不属于 ng-include...
    • 我看到了,但 Angular 没有注册控制器吗?如果是这样,那我只需要找出ui-router生成的控制器名称即可。
    • 我在 github 上提出了一个从 ui-router 获取控制器名称的功能请求。同时,遵循您的建议并创建一个循环,通过 $controllerProvider 在运行时创建控制器,并将此控制器添加到每个单独的页面元素和状态。现在主页 ng-includes 与路由状态共享相同的控制器。感谢您的指导,Radim!
    • 我很钦佩您寻找解决方案的意愿。你做到了,但请准备好重新考虑这种方法。您的某些控制器可能(迟早)成为父/子状态def的一部分,期望其$scope中有一些东西-由父控制器/解析器分配...只是想告诉如果您将重新评估您的需求,我相信您将使其仅与 ui-router 功能一起使用。很高兴看到这样的遗嘱......祝你好运先生;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多