Ember.js: Bersihkan URL yang diinginkan setelah dibatalkan

Dibuat pada 22 Jul 2014  ·  28Komentar  ·  Sumber: emberjs/ember.js

Pembaruan URL yang bersemangat bagus ketika semuanya berhasil dibatalkan atau transisi dalam runloop yang sama. Tetapi pembatalan & transisi dapat terjadi di run loop berikutnya, dan dalam hal ini kami membiarkan aplikasi dalam keadaan rusak.

Dalam kasus pembatalan, Anda mendapatkan URL yang tidak mencerminkan keadaan Anda saat ini. Lain kali pengguna menekan tombol kembali, tidak ada yang terjadi.

Dalam kasus pengalihan, Anda menghentikan tombol kembali dengan meninggalkan status perantara dalam riwayat pengguna, yang sering kali hanya akan mengarahkan mereka kembali.

Saya membahas ini dengan @machty dan kami setuju akan baik untuk mengerjakan ini. Kemungkinan besar router dapat melacak dorongan URL yang bersemangat dan melepaskannya dengan history.back() atau serupa ketika terjadi pembatalan.

Bug Inactive Needs Submitter Response

Komentar yang paling membantu

Ini telah diperbaiki oleh https://github.com/tildeio/router.js/pull/197 (di 2.10.0-beta.3 +).

Demo melawan v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1

Semua 28 komentar

Saya setuju dengan masalah ini. Saya melihatnya sekarang, meskipun saya melakukan transition.abort() di pengait willTransition pada rute. URL mencerminkan halaman yang akan dituju jika transisi tidak dibatalkan.

: +1:

@ ef4 Saya ingin Anda mencoba ini jika Anda memiliki kecenderungan; biar tahu minat / ketersediaan Anda

Saya dapat mengerjakan ini, tetapi mungkin tidak segera.

: +1: masuk ke ini saat mengikuti kode sampel willTransition di dokumen API. URL diubah meskipun abort dipanggil.

Saya punya masalah yang sama. Saya membuat jsbin membuatnya kembali untuk yang penasaran: http://emberjs.jsbin.com/tijebi/1

@ ef4 masih berencana untuk melihat ini?

Maaf, itu rendah dalam daftar prioritas saya akhir-akhir ini.

Sebagai catatan, saya baru saja mengalami masalah yang sama

Kami menyingkirkan URL yang bersemangat, mendekati jika # 9919

Untuk berjaga-jaga jika seseorang masih memiliki masalah ini dan membutuhkan solusi _sekarang_:

// app/routes/your-route.js

export default Ember.Route.extend({
    // ...
    actions: {
        willTransition(transition) {
            var model = this.controller.get('model');
            if (
                model.get('hasDirtyAttributes') && 
                !confirm("You're going to discard all unsaved changes. Are you sure?")
            ) {
                transition.abort();

                // Custom revert of Back button result
                var oldURL = this.router.generate(this.routeName, model);
                var newURL = this.router.location.getURL();
                if (oldURL != newURL) {
                    this.router.location.setURL(oldURL);
                }
            } else {
                return true;
            }
        }
    }
});

Saya tidak suka menggunakan metode this.router.location secara langsung tetapi ini seperti satu-satunya cara untuk melakukan ini sekarang (untuk menangani _semua jenis lokasi_)

Saya baru saja memperbarui jsbin saya dari tahun lalu ke 1.13.4 dan masalah ini masih ada: http://emberjs.jsbin.com/lohekasuhu/edit?html , css, js

Saya dapat mengonfirmasi bahwa ini masih menjadi masalah dengan 1.13.11 juga.

Memanggil abort() pada transisi afterModel menghasilkan URL yang diperbarui dan aplikasi menjadi rusak.

Panggilan transitionToRoute gagal memperbarui rute dengan benar, dan solusi di atas tidak lagi berfungsi karena router.location tidak memiliki metode getURL dan setURL .

Aku diperbaharui @bcardarella 's [jsbin ke 2.5.0]. Masih terjadi.

Ini telah diperbaiki oleh https://github.com/tildeio/router.js/pull/197 (di 2.10.0-beta.3 +).

Demo melawan v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1

@rwjblue Saya belum yakin ini telah diperbaiki untuk kasus transition#abort ?

@kanderek Ya, saya baru saja menemukan perilaku ini. Saya menggunakan 2.11.3.

Hai,
dengan ember 2.14, masalah tampaknya masih ada

Mengalami masalah ini dengan 2.11.3

Saat ini menggunakan solusi buruk yang saya temukan di stackoverflow

//right after an aborted transition
if (window.history) {
  window.history.forward();
}

Tolong jangan mempermalukan saya untuk itu ^

+1

Saya masih melihat masalah ini! Saya di 2.12.2

Dapatkah seseorang memberikan contoh yang gagal untuk ini?

@wagenet berikut adalah contoh menggunakan Ember 3.1.1:
https://github.com/btecu/ember-issues/tree/5210

@SirZach @adamreisnz @bcardarella @bschouwerwou @btecu @cibernox @dkorenblyum @ ef4 @kanderek @kanongil @kottenator @machty @mutewinter @pixelhandler @ rafael-paiva @rwjblue @stefanpenner @wagenet @woprandi ada masalah atau buat reproduksi baru ini, bagaimana menurut Anda?

@btecu dapatkah Anda memperbarui contoh Anda ke Ember 3.5?

+1 Mengalami ini sekarang juga (menurut saya). Dalam kasus kami, kami bertransisi ke halaman, lalu kembali menggunakan window.history.go (-1) - tampaknya hanya melanjutkan memuat halaman saat ini (menyelesaikan transisi dll dan memuat sisa konten asinkron) yang membutuhkan beberapa saat, lalu akhirnya membuat transisi kembali. Namun, url segera diperbarui. Mungkin karena kami menggunakan api history secara langsung?

Baru saja mengalami ini dengan 3.9.1

Masalah ini kacau karena bug asli sudah diperbaiki. Kami tidak lagi ingin memperbarui URL. Saya akan menutupnya karena ada banyak sejarah yang tidak relevan di sini.

@miguelcobain jika Anda dapat membagikan reproduksi Anda pada 3.9.1 sebagai terbitan baru, yang akan membantunya mendapatkan perhatian yang tepat.

Ini adalah hasil teratas ketika saya mencari masalah ini yang tampaknya masih menjadi masalah, jadi saya pikir saya akan menempelkan cuplikan yang diperbarui dengan solusi untuk siapa saja yang tersandung (tolong beri tahu saya jika ada solusi aktual yang Saya tidak tahu):

  <strong i="6">@service</strong> router

  <strong i="7">@action</strong> 
  willTransition(transition) {
    if (!transition.to.find(route => route.name === this.routeName) && !confirm('confirm?')) {
      transition.abort()
      let oldURL = this.router.currentURL;
      let newURL = this.router.location.getURL();
      if (oldURL != newURL) {
          this.router.location.setURL(oldURL);
      }
    }
    return true;
  }

Ini adalah versi sederhana dari saran yang diberikan @kottenator di atas (https://github.com/emberjs/ember.js/issues/5210#issuecomment-122033542).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat