Backbone: рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдореЙрдбрд▓ рд▓рд╛рдиреЗ/рдмрдЪрд╛рдиреЗ рдЖрджрд┐ рдХреА рд╕реНрдерд┐рддрд┐

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЬрдире░ 2013  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jashkenas/backbone

рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдордзреБрдордХреНрдЦреА рдЖрдмрд╛рджреА рд╣реЛ рд░рд╣реА рд╣реИ, рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


collection.fetch();
collection.isFetching()===true; // display loading 

(collection.isFetching()===false; && collection.length) // display no records found

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХреЗрд╕ (рд╕рд░рд▓реАрдХрд░рдг, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

javascript() // somewhere in the code collection = new MyCollection(); // somewhere else in the code view = new MyView({collection:collection}); // and somewhere else in the code collection.fetch();

рджреГрд╢реНрдп рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ, рдФрд░ рдпрд╛ рддреЛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ/рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ/рд░рд┐рдХреЙрд░реНрдб рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рдЪреАрдЬрд╝ рдХреЛ рд╕реЗрд╡/рдбрд┐рд▓реАрдЯ/рдЕрдкрдбреЗрдЯ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

@braddunbar , @caseywebdev рд╡рд┐рдЪрд╛рд░ рдЙрди рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред (рджреГрд╢реНрдп рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ _'рд╕реНрд╡рдЪреНрдЫ'_ рд╕рдВрдЧреНрд░рд╣)
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЛ 'рдЕрдиреБрд░реЛрдз' рдФрд░ 'рд╕рд┐рдВрдХ' рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рддреЛ _fetched_ , _fetching_ рдпрд╛ _unfetched_ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (tl: dr рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ) ред

рдЙрджрд╛рд╣рд░рдг 1 (рдЬрд╣рд╛рдВ рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

рдЙрджрд╛рд╣рд░рдг 2 (рджреГрд╢реНрдп рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдореНрдЯреА рд╕рдВрдЧреНрд░рд╣, рд╕рд┐рдЧреНрдирд▓ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

рдЙрджрд╛рд╣рд░рдг 3 (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

рджреГрд╢реНрдп рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣.рд▓рдВрдмрд╛рдИ == 0 рд╣реИ рддреЛ рдпрд╣ рдЕрдирдлрд╝реЗрдЪ рд╣реИред
рджреГрд╢реНрдп рдпрд╣ рднреА рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдЕрдкреНрд░рд╛рдкреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдореЗрдВ) рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдп рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИред

рд╡рд╣реА рдмрд╛рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреА рд╣реИ

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

рд╣рд╛рдп @ g00fy-! рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП "request" рдФрд░ "sync" рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?

collection.on('request', function() {
  // loading...
}).on('sync', function() {
  // display records or "none found"
});
collection.fetch();

_рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рдореЗрд░рд╛ рдорддрд▓рдм "request" рдШрдЯрдирд╛ рд╕реЗ рдерд╛, рди рдХрд┐ "fetch" ._

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ @braddunbar!

рдзрдиреНрдпрд╡рд╛рдж @caseywebdev! :)

рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ @ g00fy-ред

@braddunbar , @caseywebdev рд╡рд┐рдЪрд╛рд░ рдЙрди рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред (рджреГрд╢реНрдп рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ _'рд╕реНрд╡рдЪреНрдЫ'_ рд╕рдВрдЧреНрд░рд╣)
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЛ 'рдЕрдиреБрд░реЛрдз' рдФрд░ 'рд╕рд┐рдВрдХ' рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рддреЛ _fetched_ , _fetching_ рдпрд╛ _unfetched_ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (tl: dr рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ) ред

рдЙрджрд╛рд╣рд░рдг 1 (рдЬрд╣рд╛рдВ рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

рдЙрджрд╛рд╣рд░рдг 2 (рджреГрд╢реНрдп рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдореНрдЯреА рд╕рдВрдЧреНрд░рд╣, рд╕рд┐рдЧреНрдирд▓ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

рдЙрджрд╛рд╣рд░рдг 3 (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

рджреГрд╢реНрдп рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣.рд▓рдВрдмрд╛рдИ == 0 рд╣реИ рддреЛ рдпрд╣ рдЕрдирдлрд╝реЗрдЪ рд╣реИред
рджреГрд╢реНрдп рдпрд╣ рднреА рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдЕрдкреНрд░рд╛рдкреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдореЗрдВ) рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдп рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИред

рд╡рд╣реА рдмрд╛рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреА рд╣реИ

@ g00fy рдпрджрд┐ рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ fetch рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдкрд░ fetching рдзреНрд╡рдЬ рдпрд╛ рдРрд╕рд╛ рд╕реЗрдЯ рдХрд░реЗрдВред

collection.on({
  request: function () { this.fetching = true; },
  'sync error': function () { this.fetching = false; }
});

рдЕрдм рдЖрдкрдХрд╛ рджреГрд╢реНрдп this.collection.fetching рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдФрд░ this.collection рд▓рд┐рдП sync рдпрд╛ error рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@ рдХреЗрд╕реАрд╡реЗрдмрджреЗрд╡
рдЕрдиреБрд░реЛрдз рдирд┐рд░рд╕реНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреЛ рдЕрдиреБрд░реЛрдз рдПрдХ рд╕рд╛рде рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

// example 1
collection.fetch().abort()  // and collection.fetching == true
// example 2 - don't care about abort();
collection.fetch();
collection.fetch();
// 1st request compleated
!!collection.fetching == false // but the 2nd request is pending - should it be loading or not?
// 2nd request completed

рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП do deferred xhr

collection.on({
    'request':function(model,xhr){ 
        this.fetching = true; 
        xhr.fail(function(){this.fetching = false }.bind(this));
    },
    'sync error': function () { this.fetching = false; }
});

рдЗрд╕реАрд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд┐рд▓реНрдЯ рдЗрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╣рд░ рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ BB рдХреЛрдб-рдмреЗрд╕ рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реЛрдЧрд╛ред

рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╣рд░ рд╡реГрджреНрдзрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдмреАрдмреА рдХреЛрдб-рдмреЗрд╕ рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рд╕реВрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╣реИред рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдмреИрдХрдмреЛрди рдЖрдкрдХреЛ рдРрд╕реЗ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯ рдЬрд╛рддреЗ рд╣реИрдВред

@ g00fy- рдЖрдк рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдорд┐рдд-рд░рд╛рдЬреНрдп рдорд╢реАрди рд▓рд┐рдЦрдиреЗ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред Chaplin.js рдореЗрдВ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ ifandelse/machina.js рднреА рд╣реИ ( рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ) рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

ghost picture ghost  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chaimpeck picture chaimpeck  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

omenking picture omenking  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sarkasm picture sarkasm  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jamiebuilds picture jamiebuilds  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ