2016-09-26 48 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