2013-12-17 80 views
104

我希望能夠使用UI路由器轉換到狀態並傳遞任意對象。AngularJS:使用UI路由器將對象傳入狀態

我知道,通常使用$ stateParams,但我相信這個值被插入到URL中,我不希望用戶能夠爲這些數據添加書籤。

我想要這樣做。

$state.transitionTo('newState', {myObj: {foo: 'bar'}}); 

function myCtrl($stateParams) { 
    console.log($stateParams.myObj); // -> {foo: 'bar'} 
}; 

有沒有辦法做到這一點沒有編碼的值到URL?

+1

UI路由器機制保持導航中的URL狀態。 因此,如果用戶刷新頁面,他會回到他所在的頁面。 如果您不想使用此行爲,請考慮使用其他機制(控制器/指令等中的原始函數),並使用用於存儲臨時數據的cookie /存儲 – Neozaru

+0

將localStorage與url一起用作數據的關鍵字可能是什麼? – Neil

+2

價值從何而來? Ui.router具有在轉換到請求狀態之前將數據加載到作用域的「解析」概念。同樣有onEnter和onExit方法。另外,你可以使用本地存儲。 –

回答

144

在0.2.13,你應該能夠物體傳遞到$ state.go版本,

$state.go('myState', {myParam: {some: 'thing'}}) 

$stateProvider.state('myState', { 
       url: '/myState/{myParam:json}', 
       params: {myParam: null}, ... 

然後訪問參數在您的控制器。

$stateParams.myParam //should be {some: 'thing'} 

myParam不會顯示在URL中。

來源:

見christopherthielen https://github.com/angular-ui/ui-router/issues/983的評論,在這裏轉載出於方便:

christopherthielen:是的,這應該是現在0.2.13工作。 ('foo',{url:'/ foo /:param1?param2',params:{param3: null} // null是默認值});};}};}};

$ state。go('foo',{param1:'bar',param2:'baz',param3:{id:35, name:'what'}});

$ stateParams在 '富' 現在是{參數1: '棒',參數2: '巴茲',參數3:{ ID:35,店名: '什麼'}}

網址是/ foo /酒吧?參數2 =巴茲。

+0

也適用於'transitionTo'。 –

+11

我必須做錯事: - /我在0.2.13,但如果我試圖傳遞和反對它出現在字符串狀態'[object object]' – ErichBSchulz

+9

@ErichBSchulz雖然它不包括在這答案,使這項工作的訣竅是在狀態的URL字符串中包含參數名稱,並將類型指定爲JSON。恩。 '$ stateProvider.state('myState',{url:'/ myState/{myParam:json}',params:{myParam:null},...'參見[0.2.13發佈說明](https:// github.com/angular-ui/ui-router/releases/tag/0.2.13)和這個功能的代碼註釋 – Syon

19

其實你可以做到這一點。

$state.go("state-name", {param-name: param-value}, {location: false, inherit: false}); 

This is the official documentation about options in state.go

一切都在那裏描述,正如你可以看到這是做的方式。

+1

Awsome謝謝! – PSL

+0

我試過這個確切的代碼,並沒有保存對象。 – Virmundi

+0

你不能傳遞對象,你只能傳遞單個參數值....你把它作爲一個對象,你必須把所有的屬性作爲不同的url參數。 Angular-ui路由器開發人員仍在致力於傳遞整個對象。其實那些傢伙Svatopluk Ledl提供了一個很好的解決方案。只需將該對象作爲一個整體json字符串進行解析即可。 :) – Tek

24

有此問題

1)的使用不會改變一個URL的參數(使用params屬性)兩個部分:傳遞一個對象作爲參數

$stateProvider 
    .state('login', { 
     params: [ 
      'toStateName', 
      'toParamsJson' 
     ], 
     templateUrl: 'partials/login/Login.html' 
    }) 

2): 嗯,沒有direct way how to do it now,,因爲每個參數都被轉換爲字符串(編輯:從0.2.13開始,這不再是真實的 - 您可以直接使用對象),但是您可以通過自行創建字符串來解決該問題

toParamsJson = JSON.stringify(toStateParams); 

和目標控制器反序列化對象再次

originalParams = JSON.parse($stateParams.toParamsJson); 
+1

實際上對於傳遞對象這是一個相當不錯的破解:) – Tek

+0

好主意 - 我使用https://docs.angularjs.org/api/ng/function/angular.toJson – Rodney

+0

我們可以直接傳遞對象。檢查接受的答案 –

13

順便說一句,你還可以使用UI-SREF屬性,在模板傳遞對象

ui-sref="myState({ myParam: myObject })" 
+1

我們如何接收這個對象在.state – Shubham

+0

@Shubham你將配置'參數'的狀態,將接收該對象,然後使用$ stateParams檢索該對象。有關詳細信息,請參閱文檔http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$stateProvider。 – tao

+0

這個工作,但不能保持頁面刷新後的數據。 – tao

8

1)

$stateProvider 
     .state('app.example1', { 
       url: '/example', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/example.html', 
         controller: 'ExampleCtrl' 
        } 
       } 
      }) 
      .state('app.example2', { 
       url: '/example2/:object', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/example2.html', 
         controller: 'Example2Ctrl' 
        } 
       } 
      }) 

2)

.controller('ExampleCtrl', function ($state, $scope, UserService) { 


     $scope.goExample2 = function (obj) { 

      $state.go("app.example2", {object: JSON.stringify(obj)}); 
     } 

    }) 
    .controller('Example2Ctrl', function ($state, $scope, $stateParams) { 

     console.log(JSON.parse($state.params.object)); 


    })