2016-09-26 79 views
1

我正在开发一个Web应用程序angular 1.x和ui-router 0.3.x.当我切换到新的视图状态时,相应的控制器将被实例化(数据状态将被重置)。正如你可以从下面的代码片断看到的,终端(实际上这是jquery.terminal)将在每次切换到/logview时创建,并且在视图状态更改为其他内容时将被销毁。UI-Router:如何在切换视图时保留视图

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再次,我可以看到所有的日志消息,因为web应用程序启动..

更新1:我搜索了SO,这个question有一个非常符合要求的答案,它使用ng-show来显示/隐藏日志视图。这将是一种方式。不过,我需要非常小心地设计布局,因为我使用kendo-splitter。它将使用绝对容器的宽度和高度。一个隐藏的div将会把计算搞乱。

+1

控制器总是创建和销毁。使用服务来保存状态 – Phil

+0

我检查了'ui-router'的'controllerProvider',它可以动态实例化一个控制器,但它不能缓存任何控制器实例。我将重新设计布局,然后使用'ng-show'。 – stanleyxu2005

回答

2

周围的Googling,包括UI的路由器的社区检查some discussion后,我终于找到了所谓的ui-router-extras一个出色的UI路由器插件,它提供了一个神奇的标志sticky=true,所以我现在坚持ui-view

2

在ui-route中,状态和控制器的基本原理是加载并一次又一次地销毁。您可以使用Phil的建议(使用服务)。我曾经遇到类似的问题。我想出了一个窍门。当控制器加载时,只需定义一个$ rootcope对象。然后每当控制器加载时检查对象是否存在/定义。如果定义不要执行你的代码。否则定义$ rootcope对象并执行代码。

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. 
}); 

我认为这会成为你的目的。

+0

事实上,当状态改变时,视图被UI路由器破坏。因此,即使我避免按照您的建议重新初始化控制器,但我无法将现有控制器与新视图绑定,这是相同的,但被ui-router销毁并重新创建。 – stanleyxu2005

+0

您可以使用我之前建议的$ rootscope变量在您的视图中添加条件。 重击者会很有用。你能提供一个吗? –

1

一个很好的方法来保持viewsstate使用Ui.Router实现嵌套的路线https://github.com/angular-ui/ui-router/wiki/nested-states-%26-nested-views

+0

谢谢你暗示我,这导致。我知道ui-router支持本地的嵌套状态。但我的问题不是关于嵌套结构。我有多个州,他们是平坦的。但是一个状态('/ logview')想要保持。当我第一次点击导航栏上的“Logview”标签时,ui-router会将视图渲染为新状态。当我切换到另一个选项卡时,“Logview”仍会在后台激活,但其他选项卡始终会呈现为新状态。 – stanleyxu2005

+0

您需要将您的整个应用程序包装在一个“根状态”中,可能是抽象的,它包含您要保留的每个信息。 – Hitmands