Ember.js: рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдорд╛рд░реНрдЧ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╕рдордп TransAAborted

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рд╕рд┐рддре░ 2014  ┬╖  50рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: emberjs/ember.js

рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдорд╛рд░реНрдЧ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ рдЬрдм рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореЗрдЯреНрд╕ рдмрджрд▓рддреЗ рд╕рдордп рдПрдХ рдкреВрд░реНрдг рдорд╛рд░реНрдЧ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╣реИрдВ?

рдореИрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдПрдордмрд░ рдЧрд╛рдЗрдб (http://emberjs.com/guides/rout/query-params/) рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рддрд╛рдЬрд╝рд╛ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдСрдкреНрдЯ-рдЗрди рдЯреВ рдлреБрд▓ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдерд╛:

Ember.RSVP.configure('onerror', function(error) {
  Ember.Logger.assert(false, error);
});

рдпрд╣рд╛рдБ рдПрдХ рдЕрджреНрдпрддрди рдЬреЗрдПрд╕ рдмрд┐рди рд╣реИ: http://jsbin.com/kinajoginedo/1/edit?console , рдЖрдЙрдЯрдкреБрдЯ

рдпрджрд┐ рдЖрдк "рдЗрд╕реЗ рдмрджрд▓реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдПрдХ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рдирдЕрдмрд╛рдЙрдВрдб рддреНрд░реБрдЯрд┐ рджреЗрдЦреЗрдВрдЧреЗред

рдореИрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП 1.7.0-beta.1 + рдХреИрдирд░реА рд╕реЗ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдПрдореНрдмрд░ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реЗ рдХрдИ рдХреНрд╡рд┐рдВрдЯ рдЯреЗрд╕реНрдЯ рдлреЗрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░реАрдХреНрд╖рдг рдареАрдХ рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХреНрд░рдордг рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рдкреВрд░реНрдг рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп TransitionAborted рдЕрдкрд╡рд╛рдж рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рднреА рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рджреВрд╕рд░реЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЬрдбрд╝ рдореЗрдВ, рдЬреЛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

FYI рдХрд░реЗрдВ - рдЕрднреА рднреА 2.8.1 рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрдХрд░, рдореИрдВрдиреЗ рддрд╛рдЬрд╝рд╛ рдХреЙрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛ - рдпрд╣рд╛рдБ рдПрдХ рдорд┐рдХреНрд╕рд┐рди рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ refreshModel: true :

import Ember from 'ember';

/**
 * Debounce Refresh
 * Ember routes with queryParams that have refreshModel double-trigger a refresh:
 * see: https://github.com/emberjs/ember.js/issues/5566
 *
 * Mix this in to routes that define queryParams[param].refreshModel to avoid the TransitionAborted error thrown when double-triggering refreshes.
 */
export default Ember.Mixin.create({
  refreshDebounceThreshold: 100,
  _lastRefresh: null,
  _doRefresh() {
    if (this._lastRefresh) {
      this._lastRefresh();
      this._lastRefresh = null;
    }
  },
  refresh() {
    this._lastRefresh = this._super.bind(this, ...arguments);
    Ember.run.debounce(this, '_doRefresh', this.get('refreshDebounceThreshold'));
  }
});

рд╕рднреА 50 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ рд╢рд╛рд▓реАрди рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ ...

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрджреНрдпрддрди? рдЕрдзрд┐рдХ рдХреБрдЫ рднреА рд╣рдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣рд╛рдБ рд╡рд╣реА - рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ

рдореИрдВ рднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ RSVP рдХреЗ configure рд╡рд┐рдзрд┐ рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо RSVP.on рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред

Ember.RSVP.on('error', function(error) {
  Ember.Logger.assert(false, error);
});

рдХреНрдпрд╛ рдпрд╣ рддреНрд░реБрдЯрд┐ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдРрдкреНрд╕ рдпрд╛ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реА рд╣реИ?

рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдРрдк рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛- рдФрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдФрд░ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рд╛ рд╣реВрдБред

рдореИрдВ рдЗрд╕ TransitionAborted рддреНрд░реБрдЯрд┐ рдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

Ember.RSVP.on('error', function(error) {
  Ember.Logger.assert(false, error);
});

рдпрд╣ рдПрдХ рдРрд╕реЗ рдорд╛рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореЙрдбрд▓ рд╣рд░ 2 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдХреБрдЫ рдХреА рдЬрд╛рдВрдЪ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ fireQueryParamsDidChange рдореЗрдВ getTransitionByIntent ( transitionByIntent Ember.js 1.7.1 рдХреА рдореЗрд░реА рдХреЙрдкреА рдореЗрдВ) router.js рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ TransitionAborted рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ (рдкрд╣рд▓реА рдХреЙрд▓ queryParamsTransition рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рд╣реИ):

https://github.com/tildeio/router.js/blob/03810a915789549c4798c8eeb7d23e64b9789c75/lib/router/router.js#L64

рдЬрдм рдореИрдВ рдЙрд╕ рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░рд╛ рдРрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, transitionByIntent рджреЛ рдмрд╛рд░ рдХреНрд╡реЗрд░реА рдкрд░рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛ рджреЗ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рджреВрд╕рд░реЗ рдХреЙрд▓ рдХреЛ @raytiley рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

https://github.com/tildeio/router.js/commit/9a07446e62850e5aad241eb2c23d88127e4839d9

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ refreshModel рдХреЛ рд╕рдЪ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реИ?

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдФрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореЗрд░рд╛ рдХреНрд╡реИрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ (рдХреЙрд▓рдмреИрдХ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдореЗрдВ рдЕрд╢рдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рдкрд░рдо рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдЬрдмрдХрд┐ рдХреНрд╡реЗрд░реА рдкрд░рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рдПрдХ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рдПрдореНрдмрд░ 1.8.1 рдкрд░ рдпрд╣ рдЕрдиреБрднрд╡ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ @skoryky рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдХрдИ рдХреНрд╡реЗрд░реА params рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ @skoryky рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдИ рдЧрдИ рд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХрдВрд╕реЛрд▓ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрд╕реЛрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
JSBin: http://jsbin.com/kekowabazi/1/edit
рдПрдореНрдмрд░ рд╕рдВрд╕реНрдХрд░рдг: 1.8.1

@ рд╢реНрд░реАрдкрддрд┐ , рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдореБрджреНрджреЗ рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред fireQueryParamsDidChange рдХреЙрд▓рдмреИрдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдЙрд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк refreshModel: true рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХрдм рдЙрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдПрдХ рдиреЛрдЯрд┐рд╕ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдХреЛрдИ рднреА рдкреНрд░рд╢реНрди рдмрджрд▓ рдЧрдпрд╛), рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ queryParams рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдмрджрд▓ рджрд┐рдпрд╛:

actions: {
  queryParamsDidChange: function() {
    this.refresh();
  }
}

@skoryky рд╣рд╛рдБ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ,

рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ 1.8.1 рд╕рд╛рде-рд╕рд╛рде рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдХреНрд╡реЗрд░реА params рдЬреИрд╕реЗ рд╕реЗрдЯ рд╣реИрдВ

queryParams:
    page:
      refreshModel: true
    query:
      refreshModel: true

рдореИрдВ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИред (рдПрдореНрдмрд░ 1.9.0) рдХреЗрд╡рд▓ refreshModel: true рд╣реИред refreshModel: false рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдШрд╛рддрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдореИрдВ рднреА рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреЛрдИ рд╕реБрдзрд╛рд░?

рдореИрдВ рдЗрд╕реЗ рд╣рдорд╛рд░реА рдЕрдЧрд▓реА рдХреЛрд░ рдЯреАрдо рдмреИрдардХ рдХреЗ рдПрдЬреЗрдВрдбреЗ рдореЗрдВ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдПрдореНрдмрд░ 1.11.0-beta.4 рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред рдЕрджреНрдпрддрди?

рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛ (рдореИрдВ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдкреГрд╖реНрда рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдореНрдмрд░ 1.7.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рез.резрез.реж-рдмреАрдЯрд╛ рез + рдХрдирд╛рд░реА .реиремрезреж onрек рд╕реА рдкрд░ рдпрд╣ рджреЗрдЦрдирд╛ред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ @gorandev рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

      Ember.RSVP.on 'error', (error) ->
        if error && error.message == "TransitionAborted"
          return

рд╣рдореНрдо ...

рдпрд╣ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬреЛ рдореИрдВ рдЗрд╕ рд╕рдордп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ):

рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЦреЛрдЬ рдмреЙрдХреНрд╕ рдореЗрдВ (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ) рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдорд╛рд░реНрдЧ рдХреЗ рдореЙрдбрд▓ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдореИрдВ TransitionAborted рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдЧрд▓рддрд╛ рд╣реВрдВ, рддреЛ рдЯрд╛рдЗрдкрд┐рдВрдЧ UI рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╛рда рдмреЙрдХреНрд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдЧрд╛ред рдореИрдВ рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдвреЗрд░ рдХрд░рддреЗ рд╣реИрдВред

export default Ember.Route.extend({
  queryParams: {
    q: { replace: true, refreshModel: true },
    sort: { replace: true, refreshModel: true },
    filter: { replace: true, refreshModel: true }
  },

  model: function(params) {
     return this.store.find('user', params);
  }
}

рез.резрез.рез рдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ред рдРрдк рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рд▓рдЧрднрдЧ рдореЗрд░реЗ рд╕рднреА рдЙрддреНрдкрд╛рджрди "рддреНрд░реБрдЯрд┐" рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред (рдореИрдВ рдЯреНрд░реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: js)

рдореИрдВрдиреЗ рдПрдХ рдЕрдкрдбреЗрдЯреЗрдб jsbin (рдПрдореНрдмрд░ рд╕рдВрд╕реНрдХрд░рдг 1.11.1) рдмрдирд╛рдпрд╛: http://jsbin.com/zewuda/1/edit?html , js, output

рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо-рдЕрднреА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдСрдирд░рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рдирдЕрдмрд╛рдЙрдВрдб рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ рди рдХрд░реЗрдВред

рдореИрдВ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди refresh() рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЧрд░реНрднрдкрд╛рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ 1.13.3 рдореЗрдВ рд╣реА, @skoryky рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЕрднреА рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@Skoryky рд╕реЗ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ TransitionAborted рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП Ember.run.once рдореЗрдВ рд░рд┐рдлреНрд░реЗрд╢ () рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдкрдбрд╝рд╛ред

//in your router code

actions: {
  queryParamsDidChange: function() {
    Ember.run.once(this, this.refresh);
  }
}

@skoryky рдХрд╛ рдХрд╛рдо рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рдПрдореНрдмрд░ 1.11.3 рдкрд░ рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ =)

рдПрдореНрдмрд░ v1.10.0

@piotrze рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп next рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛:

//in your router code

actions: {
  queryParamsDidChange: function() {
    Ember.run.next(this, 'refresh');
  }
}

рд▓рдЧрддрд╛ рд╣реИ @piotrze рдХреЗ Ember.run.once рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдореНрдмрд░ 1.13 рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА 2.2 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

@richmolj @ r4m рд╡рд░реНрдХрдЕрдм рд╕реЗ рдКрдкрд░ рдЕрднреА рднреА 2.2 рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдпрд╣ рдЕрднреА рднреА рдПрдореНрдмрд░ 2.6 рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреНрд╡реЗрд░реАрдкреНрд░реЗрдо рдореЗрдВ рддрд╛рдЬрд╝рдЧреА рд░рд╣рддреА рд╣реИ: рд╕рдЪ

рдПрдореНрдмрд░ 2.7

queryParamsDidChange рдХрдИ рдмрд╛рд░ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИ, рднрд▓реЗ рд╣реА рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдХреНрд╡реЗрд░реАрдкреИрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

    queryParamsDidChange: function(a,b) {
      // Compare to prevent refresh if nothing has changed
      if(
        a.page === b.page &&
        a.selectionId === b.selectionId &&
        a.sort === b.sort &&
        a.sortDirection === b.sortDirection
      ){
        return;
      }

      Ember.run.next(this, 'refresh');
    }

FYI рдХрд░реЗрдВ - рдЕрднреА рднреА 2.8.1 рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрдХрд░, рдореИрдВрдиреЗ рддрд╛рдЬрд╝рд╛ рдХреЙрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛ - рдпрд╣рд╛рдБ рдПрдХ рдорд┐рдХреНрд╕рд┐рди рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ refreshModel: true :

import Ember from 'ember';

/**
 * Debounce Refresh
 * Ember routes with queryParams that have refreshModel double-trigger a refresh:
 * see: https://github.com/emberjs/ember.js/issues/5566
 *
 * Mix this in to routes that define queryParams[param].refreshModel to avoid the TransitionAborted error thrown when double-triggering refreshes.
 */
export default Ember.Mixin.create({
  refreshDebounceThreshold: 100,
  _lastRefresh: null,
  _doRefresh() {
    if (this._lastRefresh) {
      this._lastRefresh();
      this._lastRefresh = null;
    }
  },
  refresh() {
    this._lastRefresh = this._super.bind(this, ...arguments);
    Ember.run.debounce(this, '_doRefresh', this.get('refreshDebounceThreshold'));
  }
});

рдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП

@supersabillon рдЖрд╣, рдЬрдм "рдЪрд┐рдкрдЪрд┐рдкрд╛" рдХреНрдпреВрдкреА рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ? рдореИрдВрдиреЗ рдЙрди рдРрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛ рддреЛ рдХреНрдпреЛрдВред

2.11.0-beta.2 рдореЗрдВ рдЕрднреА рднреА рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рдБ, рдЕрднреА рднреА 2.10.0 :( рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рде рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ 2.12.0 рдореЗрдВ рдЪреБрдкрдЪрд╛рдк рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? (рдХрдореЗрдЯреА https://github.com/emberjs/ember.js/commit/cee49a315b2467f7c1a9193546a51e427dc72bd6)

@aaxelb рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЗрд╕рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред 2.12 рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╣реА рд╣реИ?

рдореИрдВрдиреЗ JSBin (рд╡рд░реНрддрдорд╛рди рдПрдореНрдмрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде) рдХрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

https://jsbin.com/cajiji/edit?html , js, output

рд╕рдорд╛рдкрди....

рдпрд╣ рддреНрд░реБрдЯрд┐ рдПрдХ рдорд╛рд░реНрдЧ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдкрд░ рднреА рдлреЗрдВрдХ рд░рд╣реА рд╣реИ:

return this.transitionTo(my_route)

рд░рд┐рдЯрд░реНрди рдХреАрд╡рд░реНрдб рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рдерд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдП (ish) RFC рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред рдЬреИрд╕рд╛ рдХрд┐ @ cesarluis13915 рдиреЗ рдХрд╣рд╛, рдПрдХ transitionTo рд╕реЗ рдкрд╣рд▓реЗ return рд╣рдЯрд╛рдХрд░ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рддрдп рдХрд┐рдпрд╛ред

рдПрдореНрдмрд░ 3.11.1 рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ред
return this.replaceWith(null, id); TransitionAborted рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
this.replaceWith(null, id); рд╕рдлрд▓: man_shrugging:

https://github.com/emberjs/ember.js/issues/18177 рдХреНрдпрд╛ рдпрд╣ рд╡рд╣реА рд╣реИ?

рдореИрдВ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛, рд╕рдВрддрд░реА рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ

@rjjblue рдкрд┐рдВрдЧ

3.11.1 рдореЗрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред # 18416 рдореЗрдВ рд░рд┐рдкреНрд░реЛ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЧрдпрд╛ред @Skoryky рдХреЗ рд╕рдорд╛рдзрд╛рди (рдзрдиреНрдпрд╡рд╛рдж!) рдХреЗ рд╕рд╛рде рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ queryParamsDidChange рдЕрдм рдПрдХ рдПрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

rafaelbnp picture rafaelbnp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lukemelia picture lukemelia  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

irminsul picture irminsul  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nathanpalmer picture nathanpalmer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amk221 picture amk221  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ