UI-Router:如何在切换视图时保留视图
Posted
技术标签:
【中文标题】UI-Router:如何在切换视图时保留视图【英文标题】:UI-Router: How to preserve views while switching views 【发布时间】:2017-02-03 07:28:13 【问题描述】:我正在使用angular
1.x 和ui-router
0.3.x 开发一个webapp。当我切换到新的视图状态时,相应的控制器将被实例化(数据状态将被重置)。从下面的代码sn-p可以看出,每次切换到/logview
时都会创建终端(其实就是jquery.terminal),当视图状态变成别的东西时会被销毁。
angular.module('app')
.config(['$stateProvider', function($stateProvider)
$stateProvider.state('logview',
url: '/logview',
templateUrl: 'views/logview/logview.html',
controller: 'LogViewCtrl'
);
])
.controller('LogViewCtrl', ['$scope', function($scope)
var terminal = $('#terminal').terminal();
console.log(terminal created');
$scope.$on('$destroy', function()
terminal.destroy();
);
])
;
我想保留 logview
并让它在后台运行,这样当我再次切换回 logview
时,我可以看到自 webapp 启动以来的所有日志消息..
更新 1:我搜索了 SO,这个 question 的答案非常符合要求,它使用 ng-show
显示/隐藏日志视图。这将是一条路要走。但是我需要非常仔细地设计布局,因为我使用kendo-splitter
。它将使用绝对容器宽度和高度。隐藏的 div 会搞砸计算。
【问题讨论】:
控制器总是被创建和销毁。使用服务保存状态 我检查了ui-router
的controllerProvider
,它可以动态实例化一个控制器,但它不能缓存任何控制器实例。我要重新设计布局,然后使用ng-show
。
【参考方案1】:
经过谷歌搜索,包括从ui-router的社区查看some discussion,我终于找到了一个很棒的ui-router插件,叫做ui-router-extras,它提供了一个神奇的标志sticky=true
,所以我现在坚持ui-view
.
【讨论】:
【参考方案2】:在ui-route中,状态和控制器的基本原理是一次又一次地加载和销毁。您可以使用 Phil 的建议(使用服务)。我曾经遇到过类似的问题。我想出了一个窍门。当控制器加载时,只需定义一个 $rootscope 对象。然后每次控制器加载时检查对象是否存在/定义。如果定义不执行你的代码。否则定义 $rootscope 对象并执行代码。
angular.module('MyApp',['ngMessages'])
.controller('AppCtrl', function($scope,$rootscope)
if (!$rootscope.myCtrl)
$rootscope.myCtrl = 'exist';
// Code you don't want to execute in this controller again and again goes here.
var terminal = $('#terminal').terminal();
console.log(terminal created');
$scope.$on('$destroy', function()
terminal.destroy();
;
// Code you want to execute in this controller goes here.
);
我认为这会达到你的目的。
【讨论】:
实际上视图被ui-router销毁,当状态改变时。因此,即使我避免按照您的建议重新初始化控制器,我也无法将现有控制器与新视图绑定,新视图是相同的,但已被 ui-router 销毁并重新创建。 您可以使用我之前建议的 $rootscope 变量将条件放入您的视图中。一个plunker会很有用。你能提供一个吗?【参考方案3】:使用Ui.Router
保持views
或state
的好方法是实现嵌套路由:https://github.com/angular-ui/ui-router/wiki/nested-states-%26-nested-views
【讨论】:
感谢您提示我这条线索。我知道 ui-router 支持原生嵌套状态。但我的问题不在于嵌套结构。我有多个州,它们是平坦的。但是一个州(/logview
)想要坚持下去。当我第一次单击导航栏上的“Logview”选项卡时,ui-router 会将视图呈现为新状态。当我切换到另一个选项卡时,“Logview”仍将在后台处于活动状态,但其他选项卡将始终呈现为新状态。
您需要将整个应用程序包装在一个 Root State
中,可能是抽象的,它包含您想要保留的每个信息。以上是关于UI-Router:如何在切换视图时保留视图的主要内容,如果未能解决你的问题,请参考以下文章
在每个页面中使用嵌套视图时如何使用 ui-router 进行页面重定向?
切换视图控制器时如何保留 UIDatePicker 和 UITextField 值?
在 UITabBarController 中,如何从一个视图控制器切换到另一个视图控制器并保留标签栏?