【问题标题】:How do I show multiple views in an abstract state template?如何在抽象状态模板中显示多个视图?
【发布时间】:2015-10-22 17:29:11
【问题描述】:

使用 Angularjs UI-Router 我正在尝试构建一个带有主视图和侧面优化/过滤结果视图的典型页面。

我已经分叉了示例应用程序,现在对其进行了修改,使其具有显示过滤器视图和主视图的父抽象状态,以便我可以共享抽象状态解析的数据。

问题是我无法在不破坏范围继承的情况下显示过滤器视图。如果我添加 'views' 参数,它会破坏范围,那么我怎样才能让它工作?

这是我的代码和 Plunker

$stateProvider
  .state('applications', {
      abstract: true,
      url: '/applications',
      templateUrl: 'planning.html',
      controller: function($scope){
          $scope.planning = [{ id:0, name: "Alice" }, { id:1, name: "Bob" }];

          $scope.filterPlanning = function(data) {
            var output = $scope.planning;
            // test filter
            output = $filter('filter')({ name: "Alice" });
            return output;
          }
      },
       /* this breaks the scope from being inherited by the child views
      views: {
          '': {
            templateUrl: 'applications.html'
          },
          'filters@applications': {
            templateUrl: 'applications.filters.html'
          }
      },*/
      onEnter: function(){
        console.log("enter applications");
      }
  })

子状态:

  .state('applications.list', {
      url: '/list',
      // loaded into ui-view of parent's template
      templateUrl: 'planning.list.html',
      onEnter: function(){
        console.log("enter applications.list");
      }
  })
  .state('applications.map', {
      url: '/map',
      // loaded into ui-view of parent's template
      templateUrl: 'planning.map.html',
      onEnter: function(){
        console.log("enter applications.map");
      }
  })

applications.html

<div class="row">
  <div class="span4">
    <div ui-view="filters"></div>
  </div>
  <div class="span8">
    <div ui-view></div>
  </div>
</div>

我已经将列表、地图和过滤器视图构建为指令,所以我希望一旦我可以让这个演示工作,我可以相对轻松地交换它们。

【问题讨论】:

  • 你可以试试&lt;div ui-view=""&gt;&lt;/div&gt;
  • @mydo47 我只是尝试过,但它什么也没做。视图仍可正确加载,但 $scope.planning 不可用。

标签: angularjs nested angular-ui-router state


【解决方案1】:

updated plunker

我想说,这里的问题是:

任何controller 属于view 不属于状态

所以这是调整后的代码:

.state('applications', {
    abstract: true,
    url: '/applications',
    // templateUrl and controller here are SKIPPED
    // not used
    // templateUrl: 'applications.html',
    // controller: ...
    views: {
      '': { 
        templateUrl: 'applications.html',
        controller: function($scope, $filter){
            $scope.planning = [
              { id:0, name: "Alice" }, 
              { id:1, name: "Bob" }
            ];

            $scope.filterPlanning = function(data) {
              var output = $scope.planning;
              // test filter
              output = $filter('filter')({ name: "Alice" });
              return output;
            }
        },
      },
      'filters@applications': {
        templateUrl: 'applications.filters.html'
      }
    },

查看文档:

Views override state's template properties

如果你定义了一个views对象,你的state的templateUrl、template和templateProvider将被忽略。因此,如果您需要这些视图的父布局,您可以定义一个包含模板的抽象状态,以及包含“视图”对象的布局状态下的子状态。

plunker to check 它在行动

【讨论】:

  • 解释得很好,谢谢。这是插入现有站点模板并查看它我不能只为整个主要内容区域提供 ui 视图,因为它周围还有其他内容。有没有办法使用以某种方式链接的两个指令,以便它们都共享相同的数据/范围?有关我的 HTML 标记,请参阅我的 updated Plunker
  • 现在得走了,以后可能会来找你......但从评论中不确定现在真正的问题是什么。哪些指令?也许...请您扩展您的问题...如果我知道,我会提供帮助(稍后)。但也许也 - 发布新问题以吸引更多和新的受众
  • 如果您以后能回来,我将非常感谢您的回答。我已经简化了问题并发布了一个新问题,希望您有机会看看:stackoverflow.com/questions/33289612/…
  • 我试图告诉你如何stackoverflow.com/a/33295159/1679310 ...如果这是你想要的,但你需要更多......让我知道。如果可以的话,我准备好提供帮助(有一些时间限制......但是;)
  • 感谢 Radim 提供的信息丰富的答案。有了你的两个答案和其他人的答案,我设法让它发挥作用。由于项目的时间限制,我没有使用ui-router,而是使用ngRoute,所以也许我会在时间允许时重新访问它以重构代码。
猜你喜欢
  • 2014-11-24
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2020-07-05
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多