Ember.js: menyetel properti controller di `setupController` tidak memperbarui parameter kueri

Dibuat pada 21 Agu 2014  ·  29Komentar  ·  Sumber: emberjs/ember.js

jika Anda memiliki Pengontrol yang ditetapkan sebagai

App.IndexController = Ember.Controller.extend({
  queryParams: ['foo'],
  foo: ''
});

dan di Routes setupController Anda melakukan sesuatu seperti ...

setupController: function(controller, model){
  controller.set('model', model);
  controller.set('foo', 'bar'); // <-- setting this should update the query param
}

Parameter kueri tidak disetel di url.

Anda dapat melihat bin yang berfungsi di sini: http://emberjs.jsbin.com/dekuj/1/edit

Bug Inactive Query Params

Komentar yang paling membantu

Saya juga melihat masalah ini di Ember 2.11, mencoba untuk menghapus parameter kueri di pengontrol tidak berpengaruh, solusi @barelyknown membuat saya sebagian besar jalan ke sana tetapi saya masih akan menganggap ini sebagai bug terbuka.

Semua 29 komentar

Diperbaiki dengan Ember.run.later (untuk memastikan bahwa semuanya telah terwujud sepenuhnya terlebih dahulu): http://emberjs.jsbin.com/kowoqo/1/edit

@machty - Apa perilaku yang diharapkan di sini?

Saya pikir kami memiliki tes eksplisit untuk ini ... pemeriksaan.

Saya pikir ini adalah bug ... kami memiliki tes untuk ini tetapi hanya dalam konteks transitionTo dan bukan boot aplikasi awal.

bekerja: http://jsbin.com/mejeto/1#/about

Saya telah menambahkan tes yang gagal untuk bug ini https://github.com/emberjs/ember.js/pull/5473
Akan mencoba untuk mencoba memperbaiki ini

Saya rasa saya menemukan masalah terkait, jadi saya tidak yakin apakah perlu tiket terpisah di sini di GitHub.

export default Ember.Controller.extend({
    queryParams: ['modal'],
    modal: null,
    handleModal: function () {
        this.send('openModal', this.get('modal'));
    }.observes('modal')
});
export default Ember.Route.extend({
    actions: {
        openModal: function (name) {
            return this.render(name, {
                into: 'application',
                outlet: 'modal'
            });
        }
    }
});

Ini berfungsi di semua kasus selain boot ketika melempar Error while processing route: index Nothing handled the action 'openModal'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

Dapat diperbaiki menggunakan Ember.run.next

handleModal: function () {
    Ember.run.next(this, function () {
        this.send('openModal', this.get('modal'));
    });
}.observes('modal')

meski rasanya salah.

JSBins:
Tanpa Ember.run.next melempar kesalahan
Dengan Ember.run.next mencetak 'redered' di konsol

@ Igor10k Saya mengalami masalah yang sama persis, modal dan semuanya. Membungkusnya di Ember.run.next memperbaikinya, tetapi bagi saya juga terasa salah.

Adakah yang bisa memastikan bahwa ini masih menjadi masalah di 1.8?

@wagenet ya ini masih masalah di 1.8:
http://emberjs.jsbin.com/lezuhu/1/edit?html , js, keluaran

dan kenari:
http://emberjs.jsbin.com/doyohe/1/edit?html , js, keluaran

@achty - Pikiran?

Saya rasa ini juga merupakan bug bagi saya yang menggunakan 1.8.1. Yang ingin saya lakukan adalah memanggil metode khusus pada pengontrol saya setiap kali queryParam tertentu berubah. Saya memiliki router yang terlihat seperti ini.
Ada saran?

// ...snip...

// for pagination
queryParams: {
  offset: {
    refreshModel: true
  }
},

model: function(params) {
  // returns model
},

setupController: function(controller, model) {
  this._super(controller, model);
  controller.set('model', model);

  // Fetch results is a method that does a bunch work
  // sets up some filters, generates a promise, resolves that promise
  // and then sets some array data on the controller once promise resolves.
  // offset is a pagination feature which determines which specific results
  // are fetched. I would like to be able to call fetchResults everytime the
  // offset queryParam is changed. 
  Ember.run.later(function() {
    controller.sendAction('fetchResults');
  })
}

// ...snip...

@machty - Ide di mana untuk mulai menggali ini?

Saya mempunyai masalah yang sama. this.set () di pengontrol tidak akan memperbarui parameter kueri di URL

App.SearchController = Ember.Controller.extend ({
queryParams: ['domain'],
domain: null,

domainField: Ember.computed.oneWay ('domain'),
tindakan: {
searchSubmit: function () {
this.set ('domain', this.get ('domainField')); // Ini menetapkan parameter 'domain' tetapi tidak mengubah URL. Jadi model di App.SearchRoute tidak pernah dipanggil seperti yang diharapkan
}
},
});

App.SearchRoute = Ember.Route.extend ({
queryParams: {
domain: {
refreshModel: true // Ikut serta dalam transisi penuh
},

},
model: function (params) {
var domain = params.queryParams.domain;

  return $.getJSON('/search?domain=usv.com&name=').then(function(resp){
  console.log(resp);
  return resp.data;
});

},
tindakan: {
segarkan: function () {
Ember.Logger.log ('Rute sekarang menyegarkan ...');
this.refresh ();
}
},
});

Bisakah Anda memberikan solusi untuk sementara?

Untuk memperjelas: this.set () dalam kode saya akan membuat perubahan ke objek Kelas, tetapi tidak mengubah URL sama sekali

Ini kuno, tapi sepertinya masih jadi masalah? Saya tidak dapat memahami situasinya, tetapi secara berkala ketika saya mencoba menetapkan parameter kueri dari pengontrol, parameter tersebut tidak menyebar ke URL. Saya dapat memeriksa nilai properti pada pengontrol dan itu disetel dengan benar, tetapi URL tidak berubah. Saya mencoba menggunakan Ember.run.next tidak berhasil. Duka!

Mengalami masalah ini juga

@rwjblue : Apakah ada pembaruan tentang ini?

Perubahan apapun? Di sini bahkan ketika mengubah nilai dari pengontrol, url diperbarui selama beberapa ms dan kembali ke nilai lama, bahkan jika pengontrol memiliki nilai baru dalam variabel

Berikut solusinya:

Di pengontrol, tambahkan pengamat yang mengubah parameter kueri di putaran proses berikutnya setelah disetel. Dalam contoh ini, saya ingin menghapus parameter kueri token dari URL dan pendekatan ini berfungsi dengan baik.

import Ember from 'ember';

export default Ember.Controller.extend({
  queryParams: ['token'],

  token: null,

  unsetToken: Ember.observer('token', function() {
    if (this.get('token')) {
      Ember.run.next(this, function() {
        this.set('token', null);
      });
    }
  }),
});

Baru saja bertemu hari ini, ketika saya mencoba menyetel parameter kueri dari setupController saat boot. run.next sepertinya solusi, tetapi saya pikir solusi yang tepat akan memiliki 2 rute dan pada boot rute pertama akan melakukan transisi ke rute kedua dengan nilai parameter kueri.

Ember 2.8

Menandai masalah sebagai tidak aktif sesuai kebijakan triase kami.

Saya juga melihat masalah ini di Ember 2.11, mencoba untuk menghapus parameter kueri di pengontrol tidak berpengaruh, solusi @barelyknown membuat saya sebagian besar jalan ke sana tetapi saya masih akan menganggap ini sebagai bug terbuka.

EDIT: Abaikan semua jazz ini. Ada beberapa informasi buruk / salah di sini, dan @locks mengarahkan saya ke solusi yang jauh lebih baik — dengan parameter kueri alih-alih segmen dinamis — sebaris tepat di bawah. Ini mengikat parameter kueri ke properti normal dengan properti komputasi bayangan yang membersihkan dan menetapkan pada get (upaya saya sebelumnya melibatkan pengikatan parameter kueri ke properti yang dihitung yang dibersihkan dan disetel pada set ) . Maaf atas kebisingannya!


Solusi yang lebih baik ...

// app/router.js
Router.map(function() {
  this.route('shop');
});

// app/routes/shop.js
export default Ember.Route.extend({
  queryParams: {
    _selectedItemIndex: {
      replace: true
    }
  }
});

// app/controllers/shop.js
import computed from 'ember-macro-helpers/computed';

export default Ember.Controller.extend({
  cart: Ember.service.inject(),

  queryParams: {
    _selectedItemIndex: 'i'
  },

  _selectedItemIndex: 0,

  selectedItemIndex: computed('_selectedItemIndex', {
    get(index) {
      const itemsLength = this.get('cart.items.length');

      if (isNaN(index) || index < 0 || index >= itemsLength) {
        index = 0;
      }

      return this.set('_selectedItemIndex', index);
    },

    set(index) {
      return this.set('_selectedItemIndex', index);
    }
  })
});


Masalah dan solusi asli ...

Saya kehilangan sebagian besar kemarin karena masalah ini yang masih berlanjut di 2,14-beta. Kasus penggunaan saya membersihkan parameter kueri untuk digunakan sebagai indeks ke dalam Ember.Array. Jika formatnya salah (mis. NaN atau string) dan / atau di luar batas, itu harus menggunakan indeks default, dan memperbarui URL untuk mencerminkan penyesuaian (sehingga peristiwa sebagai respons terhadap klik di masa mendatang memicu dengan tepat — Saya dapat menjelaskan ini lebih lanjut kepada membantu membuat kasus bahwa ini bukan hanya masalah kosmetik).

Saya tidak dapat menyetel properti dari setupController() karena tidak memperbarui URL (seperti yang dijelaskan dalam terbitan ini). Saya tidak dapat mengaturnya di centang berikutnya menggunakan Ember.run karena itu akan berpengaruh terlambat (yaitu indeks yang tidak valid sudah digunakan untuk mengakses array). Saya tidak dapat mengaturnya sekali dan kemudian mengaturnya lagi di centang berikutnya untuk memperbarui URL karena tidak ada perubahan properti (atau setidaknya itulah yang saya curigai sebagai alasan mengapa itu tidak berfungsi).

Saya tidak dapat menggunakan properti yang dihitung dengan penyetel sanitasi di pengontrol karena Anda tidak dapat mengikat parameter kueri ke properti yang dihitung. Saya tidak bisa menggunakan pengamat pada properti normal karena Anda tidak bisa menyetel properti yang Anda amati. Saya tidak dapat menggunakan pengamat dengan Ember.run karena masalah yang dijelaskan di atas.

Saya tidak dapat menelepon this.transitionTo({ queryParams: .. }) dari setupController() atau beforeModel() hook atau controller.transitionToRoute({ queryParams: .. }) dari setupController() karena # 14606 dan masalah terkait. Saya tidak dapat menyetel refreshModel menjadi true untuk parameter kueri karena hal-hal lain terjadi di hook model() yang tidak boleh diulang jika parameter kueri ini berubah.

Jelas ada rasa sakit di sini. Masalah ini, masalah # 14606, dan batasan tidak dapat mengikat parameter kueri ke properti yang dihitung semuanya digabungkan untuk membuat jebakan kecil yang rapi dan membuat frustrasi.

Berikut solusi saya: Saya membuat rute "pilih" bertingkat yang hanya mengambil parameter kueri (atau — seperti pada kode di bawah — segmen dinamis), membersihkannya, dan menyetel properti pada pengontrol induknya. Jika indeks yang dibersihkan berada di luar batas, ia akan bertransisi ke rute indeks bersarang, yang pada gilirannya akan bertransisi kembali ke rute pemilihan bersarang dengan indeks default. Rute bersarang tidak memiliki templat atau pengontrol dan rute induk tidak memiliki outlet; mereka ada hanya untuk menangani masalah perutean ini.

// app/router.js
Router.map(function() {
  this.route('shop', function() {
    this.route('index', { path: '/' });
    this.route('select', { path: '/:index' });
  });
});

// app/routes/shop.js
export default Ember.Route.extend({
  setupController(controller, model) {
    this._super(...arguments);

    // some logic to set up the cart service
  },

  model() {
    // fetch products to shop
  }
});

// app/controllers/shop.js
export default Ember.Controller.extend({
  cart: Ember.service.inject(),

  selectedItemIndex: 0,

  actions: {
    selectItem(index) {
      return this.replaceRoute('shop.select', index);
    }
  }
});

// app/routes/shop/index.js
export default Ember.Route.extend({
  beforeModel() {
    return this.replaceWith('shop.select', 0);
  }
});

// app/routes/shop/select.js
export default Ember.Route.extend({
  setupController(_, { index }) {
    this._super(...arguments);

    const
      parentController = this.controllerFor('shop'),
      itemsLength = parentController.get('cart.items.length');

    index = parseInt(index, 10);
    if (Number.isNaN(index) || index < 0 || index >= itemsLength) {
      return this.replaceWith('shop.index');
    }

    parentController.set('selectedItemIndex', index);
  },

  model: _ => _
});

@mwpastore terima kasih atas pembaruannya, kami akan menutupnya. Selamat berakhir pekan!

@locks jika Anda ingin, buka kembali masalah dokumentasi untuk mencatat ini di setupController (lihat catatan di dropdown oleh @mwpastore sebagai contoh.

@mwpastore Sepertinya kami dapat menindaklanjuti dengan posting di forum di https://discuss.emberjs.com/ dengan solusi Anda

Tunggu hingga masalah ini ditutup dengan solusi alternatif untuk mengatasi bug yang dilaporkannya, dan solusi itu melibatkan pengaturan properti di pengambil yang dihitung?

Saya penasaran apakah ada pembaruan tentang ini.

Saya menggunakan Ember.run.next di dalam Route setupController

Apakah halaman ini membantu?
0 / 5 - 0 peringkat