如何使用 Angular ui 路由器 ng-hide 和 ng-show 视图?

Posted

技术标签:

【中文标题】如何使用 Angular ui 路由器 ng-hide 和 ng-show 视图?【英文标题】:How to ng-hide and ng-show views using angular ui router? 【发布时间】:2014-03-08 21:35:38 【问题描述】:

想象一个应用程序有一个列表页面,例如一个显示用户列表的表格。表格的每一行都有一个名为“编辑”的按钮,单击此按钮时,浏览器右侧会出现一个右侧面板,其中包含用于编辑该用户内容的表单。当表单被保存或关闭时,右侧面板消失。

当进入和退出编辑状态时,如何让 Angular UI Router 自动显示/隐藏右侧面板?默认情况下,会添加和删除模板,但容器本身仍会存在于屏幕上。

在 UI Router 的演示应用程序中,html 布局为所有子状态分配了空白空间,但在我正在构建的应用程序中,如果面板不被使用甚至滑动,我真的很想隐藏它们随着状态的进入和退出,整个屏幕进出。我猜我必须使用 ng-show 和 ng-hide 才能做到这一点。我该如何使用 UI Router 来解决这个问题?

谢谢!

【问题讨论】:

【参考方案1】:

Angular 的 ui-router 提供了一种干净的方法来切换嵌套视图。

首先将 $state 注入您假设的“列表页面”控制器。然后将其暴露给本地 $scope:

.controller('ListPageCtrl', function($scope, $state) 
    $scope.$state = $state;
)

我们注入的 $state 变量有一个很好的“包含”方法。 $state.includes() 将字符串作为参数,并根据当前状态名称检查该字符串。如果状态名称与字符串匹配,则返回 true,否则返回 false。这使它非常适合与 ng-show 或 ng-hide 一起使用。

使用 ui-router 的 $state.includes() 代替与 egervari 相同的模板:

<div id="rightView" ng-show="$state.includes('list.edit')">
    <div ui-view="edit" autoscroll="false"></div>
</div> 

除了切换到包含方法之外,我还为 ui-view 属性添加了一个唯一名称。一旦你有两个以上的视图,你就会想要命名你的视图。这将使它们更容易在您的模板和逻辑中跟踪。

为您的视图添加名称。将 1 变为 2:

// 1
.state('list.edit', 
    url: 'list/edit/:id',
    templateUrl: 'template/edit.html',
    controller: 'ListPageEditCtrl'
)

// 2
.state('list.edit', 
    url: 'list/edit/:id',
    views: 
        'edit':  // this is the unique name you can reference later
            templateUrl: 'template/edit.html',
            controller: 'ListPageEditCtrl'
        
    
);

【讨论】:

【参考方案2】:

我想出的最佳解决方案是这样的:

<div id="rightView" ng-show="$state.current.name === 'adminCompanies.list.edit'">
    <div ui-view autoscroll="false"></div>
</div>

【讨论】:

你能解释一下吗?我们必须在哪里添加 ng-show? - 在父模板或子模板中。以及它是如何隐藏父视图的?【参考方案3】:

以任何方式解决此问题,只需确保在 Angular 应用程序的 .run 部分中声明如下内容:

angular.module('yourApp', ['ui.router'])

    .run(
        ['$rootScope', '$state', '$stateParams',
            function ($rootScope, $state, $stateParams)                    
                $rootScope.$state = $state;
                $rootScope.$stateParams = $stateParams;
            
            ]
    )

否则 $state 和 $stateParams 都不能从内部模板访问。想通了阅读 ui-router 文档并检查示例应用程序的代码,就在我的头撞在键盘上之后,因为这不起作用。

【讨论】:

拯救了我的一天!非常感谢!【参考方案4】:

您的网址必须使用查询字符串反映状态模式:/stuff/1?edit 或代表/stuff/1?view/stuff/1

您可以使用reloadOnSearch=false 来指示 AngularJS 不要重新加载视图:

http://docs.angularjs.org/api/ngRoute.$routeProvider

在您的controller 中,使用$routeParams 检查状态模式(viewedit)。捕捉编辑点击事件,将您的模型传递到您的栏并相应地切换其可见性。

查看那些有趣的链接:

Can you change a path without reloading the controller in AngularJS?

Updating URL in Angular JS without re-rendering view

【讨论】:

感谢您的回复。我实际上不打算使用 ngRoute。我正在使用 Angular UI 路由器:github.com/angular-ui/ui-router/wiki

以上是关于如何使用 Angular ui 路由器 ng-hide 和 ng-show 视图?的主要内容,如果未能解决你的问题,请参考以下文章

Angular ui 路由器可选 url 参数

Angular ui 路由器 - 重定向根本不起作用

使用 Angular UI-Router 在 Ionic 框架中将状态作为新路由处理

使用启用 Html5 模式的 Angular Ui 路由器时页面重新加载失败

无法直接导航到 URL Angular UI 路由器

如何在 Angular 1.5 中注入组件路由器?