Router AngularJS ui meneruskan data antara negara tanpa URL

146

Saya menghadapi masalah meneruskan data antara dua negara tanpa mengekspos data dalam url, ini seperti pengguna tidak dapat benar-benar langsung mendarat di negara ini.

Sebagai contoh. Saya memiliki dua status "A" dan "B". Saya melakukan beberapa panggilan server dalam keadaan "A" dan meneruskan respons panggilan untuk menyatakan "B". Respons panggilan server adalah pesan string, yang cukup panjang, jadi saya tidak dapat memaparkannya di url.

Jadi apakah ada cara di router ui sudut untuk melewatkan data antar negara, tanpa menggunakan parr url?

vijay tyagi
sumber

Jawaban:

185

Kita dapat menggunakan params, fitur baru dari UI-Router:

Referensi API / ui.router.state / $ stateProvider

paramsPeta yang secara opsional mengkonfigurasi parameter yang dideklarasikan di url, atau mendefinisikan parameter non-url tambahan. Untuk setiap parameter yang sedang dikonfigurasi, tambahkan objek konfigurasi yang diketik ke nama parameter.

Lihat bagian: " ... atau tentukan parameter non-url tambahan ... "

Jadi def negara adalah:

$stateProvider
  .state('home', {
    url: "/home",
    templateUrl: 'tpl.html',
    params: { hiddenOne: null, }
  })

Beberapa contoh dari dokumen yang disebutkan di atas :

// define a parameter's default value
params: {
  param1: { value: "defaultValue" }
}
// shorthand default values
params: {
  param1: "defaultValue",
  param2: "param2Default"
}

// param will be array []
params: {
  param1: { array: true }
}

// handling the default value in url:
params: {
  param1: {
    value: "defaultId",
    squash: true
} }
// squash "defaultValue" to "~"
params: {
  param1: {
    value: "defaultValue",
    squash: "~"
  } }

PERLUAS - contoh kerja: http://plnkr.co/edit/inFhDmP42AQyeUBmyIVl?p=info

Berikut adalah contoh definisi negara:

 $stateProvider
  .state('home', {
      url: "/home",
      params : { veryLongParamHome: null, },
      ...
  })
  .state('parent', {
      url: "/parent",
      params : { veryLongParamParent: null, },
      ...
  })
  .state('parent.child', { 
      url: "/child",
      params : { veryLongParamChild: null, },
      ...
  })

Ini bisa berupa panggilan menggunakan ui-sref:

<a ui-sref="home({veryLongParamHome:'Home--f8d218ae-d998-4aa4-94ee-f27144a21238'
  })">home</a>

<a ui-sref="parent({ 
    veryLongParamParent:'Parent--2852f22c-dc85-41af-9064-d365bc4fc822'
  })">parent</a>

<a ui-sref="parent.child({
    veryLongParamParent:'Parent--0b2a585f-fcef-4462-b656-544e4575fca5',  
    veryLongParamChild:'Child--f8d218ae-d998-4aa4-94ee-f27144a61238'
  })">parent.child</a>

Lihat contoh di sini

Radim Köhler
sumber
Seperti yang disarankan, saya telah mencoba menggunakan params pada status bersarang (Contoh - "/ pengguna / profil / kontak", itu memberi saya beberapa kesalahan. Apakah saya perlu mendefinisikan "params" untuk status induk juga?
vijay tyagi
Tampaknya tidak perlu meminta orang tua mendefinisikan params, terima kasih atas jawaban terinci.
vijay tyagi
Hebat jika itu membantu;) nikmati UI-Router yang perkasa
Radim Köhler
1
Sayangnya ini tidak bekerja dengan ui-router 0.2.10 dan itulah yang saya gunakan, mendapat kesalahan saat mengubah versi ke 0.2.10 - Kesalahan: Params tidak valid di negara bagian 'home'
vijay tyagi
1
@vijaytyagi, Anda harus meningkatkan. Cukup, tidak ada alasan untuk tetap menjalankan versi lama. Dan sejauh yang saya ingat, langkah itu harus lancar ...
Radim Köhler
38

Objek params termasuk dalam $ stateParams, tetapi tidak akan menjadi bagian dari url.

1) Dalam konfigurasi rute:

$stateProvider.state('edit_user', {
    url: '/users/:user_id/edit',
    templateUrl: 'views/editUser.html',
    controller: 'editUserCtrl',
    params: {
        paramOne: { objectProperty: "defaultValueOne" },  //default value
        paramTwo: "defaultValueTwo"
    }
});

2) Di controller:

.controller('editUserCtrl', function ($stateParams, $scope) {       
    $scope.paramOne = $stateParams.paramOne;
    $scope.paramTwo = $stateParams.paramTwo;
});

3A) Mengubah Status dari pengontrol

$state.go("edit_user", {
    user_id: 1,                
    paramOne: { objectProperty: "test_not_default1" },
    paramTwo: "from controller"
});

3B) Mengubah Negara dalam html

<div ui-sref="edit_user({ user_id: 3, paramOne: { objectProperty: 'from_html1' }, paramTwo: 'fromhtml2' })"></div>

Contoh Plunker

WiredIn
sumber
1
Terima kasih, sempurna. Juga perhatikan bahwa jika Anda ingin $ state dan $ stateParams, Anda hanya perlu menyuntikkan $ state. Objek stateParams adalah properti dari $ state: $ state.params.
Michael K
1
Harus dikatakan bahwa langkah 1 (memberikan nilai default) diperlukan untuk membuat sisanya berfungsi ;-)
Xtreme Biker
2
Terima kasih atas contoh singkatnya. Bekerja untukku! (UI-Router v 1.0.3)
Roboprog