рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ
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
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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдореНрдмрд░ 2.11 рдкрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдкрд░рдо рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, @barelyogn рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореБрдЭреЗ рд╡рд╣рд╛рдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдПрдХ рдЦреБрд▓рд╛ рдмрдЧ