2014-07-04 57 views
32

我一直在看這些頁面(1,2,3)。我基本上想要更改我的$state,但我不希望頁面重新加載。

我目前在頁面/schedules/2/4/2014,我想進入編輯模式,當我點擊一個按鈕,並使URL變成/schedules/2/4/2014/edit

我的edit狀態只是$scope.isEdit = true,所以沒有重新加載整個頁面的要點。但是,我確實希望$state和/或url發生更改,以便用戶在刷新頁面時以編輯模式啓動。

我該怎麼辦?

回答

19

對於這個問題,你可以創建一個具有子狀態既不templateUrl也不controller,並提前states通常之間:

// UPDATED 
$stateProvider 
    .state('schedules', { 
     url: "/schedules/:day/:month/:year", 
     templateUrl: 'schedules.html', 
     abstract: true, // make this abstract 
     controller: function($scope, $state, $stateParams) { 
      $scope.schedDate = moment($stateParams.year + '-' + 
             $stateParams.month + '-' + 
             $stateParams.day); 
      $scope.isEdit = false; 

      $scope.gotoEdit = function() { 
       $scope.isEdit = true; 
       $state.go('schedules.edit'); 
      }; 

      $scope.gotoView = function() { 
       $scope.isEdit = false; 
       $state.go('schedules.view'); 
      }; 
     }, 
     resolve: {...} 
    }) 
    .state('schedules.view', { // added view mode 
     url: "/view" 
    }) 
    .state('schedules.edit', { // both children share controller above 
     url: "/edit" 
    }); 

一個重要concept這裏要說的是,在ui-router,當應用程序在一個特定的狀態 - 當一個國家處於「積極」狀態 - 其祖先國家的所有國家也都隱含地活躍起來。

因此,在這種情況下,

  • 當從視圖模式的應用進展到編輯模式,其母公司狀態schedules(連同其templateUrlcontroller甚至resolve)仍將被保留。
  • 由於祖先狀態隱式激活,即使正在刷新子狀態(或從書籤直接加載),頁面仍會正確呈現。
+0

這會工作,但我已經有一個抽象的狀態'schedule',然後它的兩個孩子:'schedule.view'和'schedule.edit' 。我需要這個層次結構。那麼你的建議就意味着我需要有'schedule','schedule.view'和'schedule.view.edit'這(出於我將需要一段時間的原因),我不能有 – Kousha

+0

@Kousha這幾乎是和上面的代碼一樣:只要將'schedule'改爲'abstract',在那裏保存'controller'(所以它可以在'.view'和'.edit'狀態中使用),添加一個'view'狀態定義類似於'編輯'上面的一個,然後導航到'gotoView()'內的'schedules.view'。什麼可能是一個問題? – b0nyb0y

+0

@ b0nyb0y如果用戶直接瀏覽'/ edit'並將$ scope.isEdit設置爲true,該怎麼辦? – vzhen