рдмреИрдХрдмреЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдорд╡реАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐

рдПрдХ рд╕реБрдмрд╣ рдмрд╛рджрд▓, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореЗрд░реА рдкреБрд░рд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдареАрдХ рд╕реЗ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА, рдПрдХ 3 рдбреА рд╢реВрдЯрд░ рдореЗрдВ HUD рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд▓реНрдХрд╛ рдЖрд╡реЗрджрди рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ 2 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЧрд░реНрдо рдФрд░ рдЕрдиреБрднрд╡рд╣реАрди рдерд╛ред рдирддреАрдЬрддрди, рдЙрддреНрдХреГрд╖реНрдЯ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдЬреЛ рдЕрдкрдиреА рд╕рднреА рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рдордЭрджрд╛рд░ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ, рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреЗрдиреЗ, рд╕рдорд░реНрдерди рдФрд░ рдЕрджреНрдпрддрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдЙрддреНрддрд░ рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ - рдПрдорд╡реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╣реА рдкреВрд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдкрд░реЗрдЦрд╛ рдЪреБрдирдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдПрдХ рдареЛрд╕ рдЖрдзрд╛рд░ рдмрди рдЬрд╛рдПрдЧрд╛ред рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реЛрдз рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ backbone.js рдХреЛ рдЪреБрдирд╛ред рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдФрд░ рд▓рдЪреАрд▓рд╛рдкрди рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдЖрдк рдмрд╕ рд╕реНрд░реЛрдд рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд┐ рдХреГрдкрдпрд╛ рдирд╣реАрдВ рдерд╛ рдПрдорд╡реА рдкреИрдЯрд░реНрди рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдИ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддрд░реНрдХ рдХреЛ рдзрдмреНрдмрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдкрдХреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрджрд╛ рд╣реБрдЖ рдерд╛, рдЬреЛ рдкрд╣реЗрд▓реА рдХреЗ рд▓рд╛рдкрддрд╛ рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рд╕рд╛рде рд╣реА, рдХреБрдЫ рдирдпрд╛ рдмрдирд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдордЬреЗрджрд╛рд░ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИред рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдВрдкреВрд░реНрдг рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рднреА рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ (рджреЛрдиреЛрдВ рдмреБрдирд┐рдпрд╛рджреА рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ) рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ (рд╡рд┐рдЪрд╛рд░реЛрдВ) рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдХрдВрдХрд╛рд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
Controller = { views: {}, // views hash map models: {}, // models hash map collections: {}, // collections hash map // Set of methods to get existing view, get view constructor and create new view using constuctor getView: function() {}, getViewConstructor: function() {}, createView: function() {}, // Set of methods to get existing model, get model constructor and create new model using constuctor getModel: function() {}, getModelConstructor: function() {}, createModel: function() {}, // Set of methods to get existing collection, // get collection constructor and create new collectionusing constuctor getCollection: function() {}, getCollectionConstructor: function() {}, createCollection: function() {}, // This method will subscribe controller instance to view events addListeners: function() {} } 


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

рдЖрд╡реЗрджрди рдХрд╛ рдХрдВрдХрд╛рд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 Application = { //Method that will initialize all controllers upon applicaiton launch initializeControllers: function() {}, // Set of methods to get existing model, get model constructor and create new model using constuctor getModel: function() {}, getModelConstructor: function() {}, createModel: function() {}, // Set of methods to get existing collection, get collectionconstructor and create new collectionusing constuctor getCollection: function() {}, getCollectionConstructor: function() {}, createCollection: function() {}, } 

рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рд╕рднреА рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рддреБрд░рдВрдд рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреЙрд▓рдмреИрдХ рдЙрд╕ рд╕рдордп рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рд╣реЛрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ "рдкрддрд╛" рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрд╡реЗрджрди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рд╣рдо рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 // Create collection instances upon application start Application.buildCollections() // Initialize all application controllers Application.initializeControllers() 


рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдЗрдХрд╛рдИ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

 EventBus = { // Function to add event listeners addListeners: function() {}, // Function to fire event listneres fireEvent: function() {} } 


рдЕрдм рдЬрдм рдореВрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╡реЗрджрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рдореБрдЦреНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ - Application ред рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдмреИрдХрдмреЛрди рдХрд░рддрд╛ рд╣реИред
 var Application = function(options) { _.extend(this, options || {}); // Create a new instance of EventBus and pass the reference to out application this.eventbus = new EventBus({application: this}); // Run application initialization if needed this.initialize.apply(this, arguments); // Create documentReady callback to lauch the application $($.proxy(this.onReady, this)); }; 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, _.extend рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ _.extend , рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
 _.extend(Application.prototype, { // Hash maps to store models, collections and controllers models: {}, collections: {}, controllers: {}, /** * Abstract fuction that will be called during application instance creation */ initialize: function(options) { return this; }, /** * Called on documentReady, defined in constructor */ onReady: function() { // initialize controllers this.initializeControllers(this.controllers || {}); // call to controller.onLauch callback this.launchControllers(); // call application.lauch callback this.launch.call(this); }, /** * Function that will convert string identifier into the instance reference */ parseClasses: function(classes) { var hashMap = {}; _.each(classes, function(cls) { var classReference = resolveNamespace(cls), id = cls.split('.').pop(); hashMap[id] = classReference; }, this); return hashMap; }, /** * Abstract fuction that will be called during application lauch */ launch: function() {}, /** * Getter to retreive link to the particular controller instance */ getController: function(id) { return this.controllers[id]; }, /** * Function that will loop throught the list of collection constructors and create instances */ buildCollections: function() { _.each(this.collections, function(collection, alias) { this.getCollection(alias); }, this); } }); 


рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Application.initializeControllers рд╕реАрдзреЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдореЙрдбрд▓ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рддрддреНрдХрд╛рд▓ рдФрд░ рдШрдЯрд╛ рджреЗрдВрдЧреЗред рдФрд░ Application.launchControllers рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ Controller.onLaunch рдХреЙрд▓рдмреИрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред
 _.extend(Application.prototype, { ... /** * Fuction that will loop through all application conrollers and create their instances * Additionaly, read the list of models and collections from each controller * and save the reference within application */ initializeControllers: function(controllers) { this.controllers = {}; _.each(controllers, function(ctrl) { var classReference = resolveNamespace(ctrl), id = ctrl.split('.').pop(); // create new Controller instance and pass reference to the application var controller = new classReference({ id: id, application: this }); controller.views = this.parseClasses(controller.views || []); _.extend(this.models, this.parseClasses(controller.models || [])); _.extend(this.collections, this.parseClasses(controller.collections || {})); this.buildCollections(); this.controllers[id] = controller; }, this); }, /** * Launch all controllers using onLauch callback */ launchControllers: function() { _.each(this.controllers, function(ctrl, id) { ctrl.onLaunch(this); }, this); } ... }); 


рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХреЛрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Application.addListeners рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ EventBus рдХреЛ рдХрд╛рд░реНрдп рд╕реМрдВрдкрддрд╛ рд╣реИ:
 _.extend(Application.prototype, { ... /** * Abstract fuction that will be called during application lauch */ addListeners: function(listeners, controller) { this.eventbus.addListeners(listeners, controller) } ... }); 


рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рдФрд░ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ; рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
 _.extend(Application.prototype, { ... /** * Getter to retreive link to the particular model instance * If model instance isn't created, create it */ getModel: function(name) { this._modelsCache = this._modelsCache || {}; var model = this._modelsCache[name], modelClass = this.getModelConstructor(name); if(!model && modelClass) { model = this.createModel(name); this._modelsCache[name] = model; } return model || null; }, /** * Getter to retreive link to the particular model consturctor */ getModelConstructor: function(name) { return this.models[name]; }, /** * Function to create new model instance */ createModel: function(name, options) { var modelClass = this.getModelConstructor(name), options = _.extend(options || {}); var model = new modelClass(options); return model; }, /** * Getter to retreive link to the particular collection instance * If collection instance isn't created, create it */ getCollection: function(name) { ... }, /** * Getter to retreive link to the particular collection consturctor */ getCollectionConstructor: function(name) { ... }, /** * Function to create new collection instance */ createCollection: function(name, options) { ... }, ... }); 


рдЕрдм, рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдмреБрдирд┐рдпрд╛рджреА рдирд┐рд░реНрдорд╛рдг рддреИрдпрд╛рд░ рд╣реИред рдЙрд▓реНрд▓реЗрдЦ Application.parseClasses рд╡рд┐рдзрд┐ рд╕реЗ рдмрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ, рдореЙрдбрд▓, рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рд╣реЛ рд░рд╣реА рд╣реИ
 [ 'myApplication.controller.UserManager', 'myApplication.controller.FormBuilder' ] 

Application.parseClasses рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдореИрдкрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛
 { 'UserManager': myApplication.controller.UserManager, 'FormBuilder': myApplication.controller.FormBuilder } 


рдЗрд╕рд▓рд┐рдП рдореИрдВ 2 рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рд▓рд┐рдВрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдирд╛рдореЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред рджреВрд╕рд░реЗ, рд╣рдо рдмреЗрд╕ рднрд╛рдЧреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд╛рдо рд╕рднреА рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╣реЛрдВрдЧреЗред

рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХреЛрдб рдорд┐рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо Application рд▓рд┐рдП рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо рд╕реМрдВрдкрддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдШреЛрд╖рдгрд╛:

 var Controller = function(options) { _.extend(this, options || {}); this.initialize.apply(this, arguments); }; 

рдФрд░ рдлрд┐рд░ рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 _.extend(Controller.prototype, { views: {}, models: {}, collections: {}, initialize: function(options) { }, /** * Add new listener to the application event bus */ addListeners: function(listeners) { this.getApplication().addListeners(listeners, this); }, /** * Abstract fuction that will be called during application lauch */ onLaunch: function(application) { }, /** * Getter that will return the reference to the application instance */ getApplication: function() { return this.application; } }); 


рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ:
 _.extend(Controller.prototype, { ... /** * Getter that will return the reference to the view constructor */ getViewConstructor: function(name) { return this.views[name]; }, /** * Function to create a new view instance * All views are cached within _viewsCache hash map */ createView: function(name, options) { var view = this.getViewConstructor(name), options = _.extend(options || {}, { alias: name }); return new view(options); } ... }); 


рд╣рдо рдЕрдкрдиреЗ Application рд▓рд┐рдП рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╕реМрдВрдкрддреЗ рд╣реИрдВ
 _.extend(Controller.prototype, { ... /** * Delegate method to get model instance reference */ getModel: function(name) { return this.application.getModel(name); }, /** * Delegate method to get model constructor reference */ getModelConstructor: function(name) { return this.application.getModelConstructor(name); }, /** * Delegate method to create model instance */ createModel: function(name, options) { return this.application.createModel(name) }, /** * Delegate method to get collection instance reference */ getCollection: function(name) { return this.application.getCollection(name); }, /** * Delegate method to get collection constructor reference */ getCollectionConstructor: function(name) { return this.application.getCollectionConstructor(name); }, /** * Delegate method to create collection instance */ createCollection: function(name, options) { return this.application.createCollection(name); } ... }); 


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ Application.EventBus рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рджреЗрдВ
 _.extend(Controller.prototype, { ... /** * Delegate method to fire event */ fireEvent: function(selector, event, args) { this.application.eventbus.fireEvent(selector, event, args); } ... }); 

рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдирд┐рд░реНрдорд╛рдг рддреИрдпрд╛рд░ рд╣реИ! рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╣реИ :)

EventBus рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ Backbone.View рдХреЗ рдореВрд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрдпрдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо alias рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдШрдЯрдХ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рд╛рдЗрди рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ рдПрдХ fireEvent рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдореВрд▓ View.trigger() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирдИ рдШрдЯрдирд╛ EventBus рдХреЛ EventBus ред

 var EventBus = function(options) { var me = this; _.extend(this, options || {}); // Extend Backbone.View.prototype _.extend(Backbone.View.prototype, { alias: null, /* * Getter that wll return alias */ getAlias: function() { return this.options.alias; }, /* * Instead of calling View.trigger lets use custom function * It will notify the EventBus about new event */ fireEvent: function(event, args) { this.trigger.apply(this, arguments); me.fireEvent(this.getAlias(), event, args); } }); }; 


рдЕрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП EventBus.addListeners рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ EventBus.fireEvent рд╡рд╛рдВрдЫрд┐рдд рд╣реИрдВрдбрд▓рд░ рдкрд░ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
 _.extend(EventBus.prototype, { // Hash Map that will contains references to the all reginstered event listeners pool: {}, /** * Function to register new event listener */ addListeners: function(selectors, controller) { this.pool[controller.id] = this.pool[controller.id] || {}; var pool = this.pool[controller.id]; if(_.isArray(selectors)) { _.each(selectors, function(selector) { this.control(selector, controller); }, this) } else if(_.isObject(selectors)) { _.each(selectors, function(listeners, selector) { _.each(listeners, function(listener, event) { pool[selector] = pool[selector] || {}; pool[selector][event] = pool[selector][event] || []; pool[selector][event].push(listener); }, this); }, this) } }, /** * Function to execute event listener */ fireEvent: function(selector, event, args) { var application = this.getApplication(); _.each(this.pool, function(eventsPoolByAlias, controllerId) { var events = eventsPoolByAlias[selector]; if(events) { var listeners = events[event] controller = application.getController(controllerId); _.each(listeners, function(fn) { fn.apply(controller, args); }); } }, this); }, /** * Getter to receive the application reference */ getApplication: function() { return this.options['application']; } }); 


рд╣реБрд░реНрд░реЗ! рдЕрдм рд╕рднреА рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢
 Application.extend = Backbone.Model.extend; Controller.extend = Backbone.Model.extend; 

рдЕрдм рд╣рдо extend рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдмреЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЙрджрд╛рд╣рд░рдг



рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Backbone.Application рдкреЗрдЬ рдкрд░ рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдкреНрд░рд▓реЗрдЦрди

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рднреА рдмрдирд╛рдпрд╛ - рдпрд╣ рдПрдорд╡реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЯреВрдбреЛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ - github.com/namad/Backbone.Application/blob/master/examples/ToDo/js/todos.js

рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдкреВрд░реА рдмрд╛рдЗрдХ рд▓рд┐рдЦреА рд╣реИ , рд╡рд╣ рд╣реИ рд╡рд┐рдЬрд╝реБрдз , рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдХреНрд╡реЗрдХ рд▓рд╛рдЗрд╡ рдЧреЗрдо рдХреЗ рд▓рд┐рдП HUD рд╕рдВрдкрд╛рджрдХред рдлрд┐рд▓рд╣рд╛рд▓, рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИ, рдЖрдкрдХреЛ рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЫреВ рд╕рдХрддреЗ рд╣реИрдВред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, Google рдХреЛрдб рдкрд░ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб

PS рдпрд╣ рдЗрд╕ рдкреНрд░рдХреГрддрд┐ рдХрд╛ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ :) рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рд╡рдЬрди рд╕реЛрдиреЗ рдореЗрдВ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In149626/


All Articles