Ember.js: рдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ `setupController` рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдХреНрд╡реЗрд░реА рдкрд░рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ

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

рдФрд░ рд░реВрдЯ рд╕реЗрдЯрдЕрдк рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ ...

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

рдХреНрд╡реЗрд░реА parl url рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдмрд┐рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: http://emberjs.jsbin.com/dekuj/1/edit

Bug Inactive Query Params

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

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдореНрдмрд░ 2.11 рдкрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдкрд░рдо рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, @barelyogn рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореБрдЭреЗ рд╡рд╣рд╛рдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдПрдХ рдЦреБрд▓рд╛ рдмрдЧ

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

Ember.run.later (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреМрддрд┐рдХ рд╣реЛ рдЪреБрдХреА рд╣реИрдВ ):

@ рдордЪреНрдЯреА - рдпрд╣рд╛рдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдереЗ ... рдЬрд╛рдБрдЪред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ ... рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ transitionTo рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмреВрдЯрдЕрдк рдирд╣реАрдВ рд╣реИред

рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ: http://jsbin.com/mejeto/1#/about

рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рд╛ рдЬреЛрдбрд╝ рджреА рд╣реИ https://github.com/emberjs/ember.js/pull/5473
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдкрд░ рд▓рдбрд╝рдЦрдбрд╝рд╛ рдЧрдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ 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'
            });
        }
    }
});

рдпрд╣ рдмреВрдЯрдЕрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ 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. рдлреЗрдВрдХрддрд╛ рд╣реИ

Ember.run.next рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

JSBins:
рдмрд┐рдирд╛ Ember.run.next рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ
Ember.run.next рдХреЗ рд╕рд╛рде рдХрдВрд╕реЛрд▓ рдореЗрдВ 'redered' рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

@ рдЗрдЧреЛрд░ 10k рдореИрдВ рдЗрд╕реА рд╕рдЯреАрдХ рдореБрджреНрджреЗ, рдореЛрдбрд▓ рдФрд░ рд╕рднреА рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВред Ember.run.next рдореЗрдВ рд▓рдкреЗрдЯрдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА 1.8 рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ?

@wagenet рд╣рд╛рдБ рдпрд╣ рдЕрднреА рднреА 1.8 рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ:
http://emberjs.jsbin.com/lezuhu/1/edit?html , js, output

рдФрд░ рдХреИрдирд░реА:
http://emberjs.jsbin.com/doyohe/1/edit?html , js, output

@ рдордЪреНрдЯреА - рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 1.8.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдПрдХ рдмрдЧ рд╣реИред рдореИрдВ рдЬреЛ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╡реЗрд░реАрдкрд░рд╛рдо рдмрджрд▓рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд╛рдЙрдЯрд░ рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рдХреЛрдИ рд╕рд▓рд╛рд╣?

// ...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 - рдЗрд╕ рдкрд░ рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рднреА рдпрд╣реА рддрдХрд▓реАрдлрд╝ рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдпрд╣ .рд╕реЗрдЯ () URL рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛

App.SearchController = Ember.Controller.extend ({
рдХреНрд╡реЗрд░реАрдкрд░рд╛рдо: ['рдбреЛрдореЗрди'],
рдбреЛрдореЗрди: рдЕрд╢рдХреНрдд,

domainField: Ember.computed.oneWay ('рдбреЛрдореЗрди'),
рдХреНрд░рд┐рдпрд╛: {
SearchSubmit: рдлрд╝рдВрдХреНрд╢рди () {
it.set ('domain', this.get ('domainField')); // рдпрд╣ 'рдбреЛрдореЗрди' рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди URL рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП App.SearchRoute рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рдХрднреА рднреА рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
}
},
});

App.SearchRoute = Ember.Route.extend ({
рдХреНрд╡реЗрд░реАрдкреНрд░реЗрдо: {
рдбреЛрдореЗрди: {
рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ: рдкреВрд░реНрдг рд╕рдВрдХреНрд░рдордг рдореЗрдВ рд╕рдЪ // рдСрдкреНрдЯ
},

},
рдореЙрдбрд▓: рдлрд╝рдВрдХреНрд╢рди (рдкрд░рдо) {
var рдбреЛрдореЗрди = params.queryParams.domain;

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

},
рдХреНрд░рд┐рдпрд╛: {
рддрд╛рдЬрд╝рд╛: рдлрд╝рдВрдХреНрд╢рди () {
Ember.Logger.log ('рдорд╛рд░реНрдЧ рдЕрдм рддрд╛рдЬрд╝рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ ...');
this.refresh ();
}
},
});

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЕрдВрддрд░рд┐рдо рдореЗрдВ рдХреЛрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ this.set () рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди URL рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ

рдпрд╣ рдкреНрд░рд╛рдЪреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдореИрдВ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рд╕рдордп-рд╕рдордп рдкрд░ рдЬрдм рдореИрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдПрдХ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ URL рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди URL рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдн рдХреЗ Ember.run.next рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╣рд╛рдп!

рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рднреА

@rwjblue : рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди? рдпрд╣рд╛рдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рд╡реИрд▓реНрдпреВ рдмрджрд▓рддреЗ рд╕рдордп, рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдПрд▓ рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдкрд░ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдкрд╛рд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдирдпрд╛ рдореВрд▓реНрдп рд╣реЛ

рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:

рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдо рдХреЛ рдЕрдЧрд▓реЗ рд░рди рд▓реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ URL рд╕реЗ token рдХреНрд╡реЗрд░реА рдкрд░рдо рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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);
      });
    }
  }),
});

рдмрд╕ рдЖрдЬ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдЬрдм рдореИрдВрдиреЗ рдмреВрдЯ рдкрд░ setupController рд╕реЗ рдПрдХ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред run.next рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП 2 рдорд╛рд░реНрдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рдмреВрдЯ рдкрд░ рдкрд╣рд▓рд╛ рдорд╛рд░реНрдЧ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рдорд╛рд░реНрдЧ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдЧрд╛ред

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

рдЕрдВрдХрди рд╣рдорд╛рд░реА рдЯреНрд░рд╛рдЗрдПрдЬ рдкреЙрд▓рд┐рд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореБрджреНрджрд╛ рд╣реИред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдореНрдмрд░ 2.11 рдкрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдкрд░рдо рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, @barelyogn рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореБрдЭреЗ рд╡рд╣рд╛рдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдПрдХ рдЦреБрд▓рд╛ рдмрдЧ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рд╕рднреА рдЬреИрдЬрд╝ рдХреЛ рдЕрдирджреЗрдЦрд╛ @locks рдиреЗ рдПрдХ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рд╣реИ - рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЦрдВрдб рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде-рдЗрди-рд▓рд╛рдЗрди рддреБрд░рдВрдд рдиреАрдЪреЗред рдпрд╣ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрд╛рдпрд╛ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдмрд╛рдВрдзрддрд╛ рд╣реИ рдЬреЛ sanitizes рдФрд░ get рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ (рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдХрдВрдкрд╛рдЙрдВрдб рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ set рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) ред рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ!


рдмреЗрд╣рддрд░ рдЙрдкрд╛рдп ...

// 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);
    }
  })
});


рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди ...

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд▓ рдХрд╛ рдмреЗрд╣рддрд░ рд╣рд┐рд╕реНрд╕рд╛ рдЦреЛ рджрд┐рдпрд╛ рдЬреЛ рдЕрднреА рднреА 2.14-рдмреАрдЯрд╛ рдореЗрдВ рдмрдиреА рд╣реБрдИ рд╣реИред рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдПрдХ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдореНрдмрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sanitizing рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдХреГрдд рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП NaN рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ / рдпрд╛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░, рддреЛ рдЗрд╕реЗ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рдорд╛рдпреЛрдЬрди рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП URL рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреНрд▓рд┐рдХ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдШрдЯрдирд╛рдПрдВ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд╕рдХреЗрдВ - рдореИрдВ рдЗрд╕реЗ рдЖрдЧреЗ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдорд╣рдЬ рдПрдХ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЛ setupController() рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ URL рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ)ред рдореИрдВ рдЗрд╕реЗ Ember.run рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЧрд▓реЗ рдЯрд┐рдХ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдЧрд╛ (рдпрд╛рдиреА рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛)ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдЧрд▓реА рдЯрд┐рдХ рдореЗрдВ URL рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

рдореИрдВ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рд╕реИрдирд┐рдЯреЗрдЯрд┐рдВрдЧ рд╕реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЧрдгрдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдмрд╛рдВрдз рдирд╣реАрдВ рд╕рдХрддреЗред рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг Ember.run рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореИрдВ рдлреЛрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ this.transitionTo({ queryParams: .. }) рд╕реЗ setupController() рдпрд╛ beforeModel() рд╣реБрдХ рдпрд╛ controller.transitionToRoute({ queryParams: .. }) рд╕реЗ setupController() рдХреЗ рдХрд╛рд░рдг # 14606 рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВред рдореИрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП refreshModel рд╕реЗ true рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд╕рд╛рдорд╛рди model() рд╣реБрдХ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдпрд╣ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓рддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рджрд░реНрдж рдХрд╛ рдПрдХ рдиреЗрдХреНрд╕рд╕ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛, # 14606 рдЬрд╛рд░реА рдХрд░рддреА рд╣реИ, рдФрд░ рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░рд╛, рдирд┐рд░рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдереЛрдбрд╝рд╛ рдЬрд╛рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдпреЛрдЬрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕реАрдорд╛ред

рдпрд╣рд╛рдВ рдореЗрд░рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ: рдореИрдВрдиреЗ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб "рд╕рд┐рд▓реЗрдХреНрдЯ" рд░реВрдЯ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдмрд╕ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ (рдпрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ - рдПрдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ), рдЗрд╕реЗ sanitizes, рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЗрд╕рдХреЗ рдореВрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕реИрдирд┐рдЯрд╛рдЗрдЬреНрдб рдЗрдВрдбреЗрдХреНрд╕ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рддреЛ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдЗрдВрдбреЗрдХреНрд╕ рд░реВрдЯ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдбрд┐рдлреЙрд▓реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдиреЗрд╕реНрдЯреЗрдб рд╕реЗрд▓реЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдХреЛрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореВрд▓ рдорд╛рд░реНрдЧ рдХрд╛ рдХреЛрдИ рдЖрдЙрдЯрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ; рд╡реЗ рдЗрд╕ рд░реВрдЯрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред

// 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 рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣рдо рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред рддреБрдореНрд╣рд╛рд░рд╛ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдЕрдВрдд рдЕрдЪреНрдЫрд╛ рд╣реЛ!

@locks рдпрджрд┐ рдЖрдк setupController рдкрд░ рдпрд╣ рдиреЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ @mwpastore рджреНрд╡рд╛рд░рд╛ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдореЗрдВ рдиреЛрдЯ рджреЗрдЦреЗрдВ)ред

@mwpastore рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде https://discuss.emberjs.com/ рдкрд░ рдордВрдЪ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрдЧ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛ рдЬрд╛рдП, рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдЧрдЯрд░ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ?

рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдЗрд╕ рдкрд░ рдЕрджреНрдпрддрди рд╣реИ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдБред

рдореИрдВ рд░реВрдЯ рдХреЗ setupController рдЕрдВрджрд░ Ember.run.next рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

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

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

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

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

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

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

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