在同一控制器内切换视图,同时保留范围数据

Switching views within the same controller whilst retaining scope data

我有一页数据可以作为列表或地图上的标记来查看。它还在侧边栏中具有过滤功能。我目前将其结构化为单独的地图和列表页面,但我想合并它们,以便在切换视图时保留过滤器。

我曾尝试使用 ui-router,但由于我的标记,我无法将过滤保留在父状态中,根据我在此处的问题:

我当前的标记是这样的:

<div class="main-container" ng-controller="PlanningCtrl" data-county-parish-id="1478">
    <main class="page-content">
        <!-- toggles between map and list views -->
        <a href="/map">View map</a>

        <!-- main content view here -->
        <appl-list></appl-list>

        <!-- <appl-map></appl-map> -->
    </main>
    <aside class="sidebar">
        <div refine-results info="refine" id="SearchForm" class="refine-search"></div>
    </aside>
</div>

数据数组在控制器中作为 $scope.filteredApplications 并且在每个页面上,这在每个指令中都可以很好地过滤和显示。

我想我的问题是:如何在两个 <appl-*> 指令之间切换并显示相同的筛选记录?

您可以将 ng-if 与您的指令一起使用,并根据范围变量设置值。

你的控制器应该是这样的:

$scope.show = 'List'

然后你的 HTML:

    <appl-list ng-if="show==='List'></appl-list>

    <appl-map ng-if="show==='Map'></appl-map>

然后您将根据某些事件在 'List' 和 'Map' 之间切换 $scope.show 的值。

如果我正确理解你的问题,解决方案真的非常接近。我们将从 UI-路由器原生设计中获益。这是一个完整的故事 (带有工作示例):

How do I share $scope data between states in angularjs ui-router?

因此,我们应该做的是正确使用视图数据继承 - 这与某些参考 属性 一起使用效果很好,例如Model : {} 在父状态(根视图)上声明

controller('rootController', function ($scope) {
  $scope.Model = {SomeProperty : "xxx"}; // root controller creates it
})

我们也可以(可以)引入一些超级根状态,并轻松地将其注入到每个状态家族的超级父级中

.state('root', {
  template: "<div ui-view></div>",
  controller: "rootController"
}

// any grand parent of some state hierarchy

.state("business", {
  parent: "root",
  ...
.state("athorization", {
  parent: "root"

以后任何控制器(任何控制器,因为我们从根未命名视图继承)都可以进行过滤

$scope.Model.Filter = {...}

并且任何其他控制器都可以使用该过滤器

$scope.filterPlanning = function() {
  var data = ...
  var filter = $scope.Model.Filter;
  // filter magic
  ...

  return filteredOutput;
}

可以在此处找到类似的技术,包括 TypeScript 中的示例 (也有工作示例)