Spine.js рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдЦрдирд╛

Spine.js рдХрд╛ рдкрд░рд┐рдЪрдп


рд╕реНрдкрд╛рдЗрди рдПрдХ рдЫреЛрдЯрд╛ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдорд╡реАрд╕реА рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реАрдзреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдХреЛрдб рдкреГрдердХреНрдХрд░рдг, рдореЙрдбрд▓ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрдкрдХрд░рдг рдХрд╛рдлреА рд╣рдж рддрдХ Backbone.js рдПрдкреАрдЖрдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдврд╛рдВрдЪреЗ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдкрд╛рдЗрди рдХреЛ рд╕рдордЭреЗрдВрдЧреЗ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВ)ред Spine.js HTML5 рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣рд░ рджрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреМрдЦрдЯреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рддреЛ рдХреНрдпрд╛ Spine.js рдЗрддрдирд╛ рдЦрд╛рд╕ рд╣реИ?

рдирдореВрдирд╛ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрдВред

рд╕реНрдкрд╛рдЗрди рдХреНрд▓рд╛рд╕реЗрд╕, рдореЙрдбрд▓реНрд╕, рдФрд░ рд╡реНрдпреВрдЬрд╝


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



рдХрдХреНрд╖рд╛рдПрдВ


рд╕реНрдкрд╛рдЗрди рдХреЗ рдмрд╣реБрдд рджрд┐рд▓ рдореЗрдВ, Object.create рдХрд╛ рдЕрдиреБрдХрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

var twitterClient = Spine.Class.create(); //or var twitterClientWithArgs = Spine.Class.create({ testMessage: "If it weren't for WebMD I would have never known what symptoms to mimic so I could get all these prescriptions from my doctor." }); 

рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, init () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрд╛рдЗрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ "рддрддреНрдХрд╛рд▓" рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

 var twitterClient = Spine.Class.create({ testMessage: "Hello world" }); var myclient = twitterClient.init(); 

рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ init () рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 var twitterClient = Spine.Class.create({ init:function(testMessage){ this.testMessage = testMessage; } }); 

рдЖрджрд░реНрд╢


рд╕реНрдкрд╛рдЗрди рдореЗрдВ, рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рднреАред рдЖрдк рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ MVC рдкрд░ рдмрдирдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореЙрдбрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ Model.records рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реНрдкрд╛рдЗрди рд╕реЗрдЯрдЕрдк () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ () рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 var Tweets = Spine.Model.setup("Tweet", ["username","tweet_message"]); 

рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 Tweets.include({ toTweetString: function(){ return("@" + this.username + " " + this.tweet_message); } }); 

рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЕрднреА рднреА рдПрдХ рд╣реА рд╕рд░рд▓ рд╣реИ .init () рд╡рд┐рдзрд┐:

 var mytweets = Tweets.init({username: "addyosmani", tweet_message: "hai twitter"}); 

рд╕реНрдкрд╛рдЗрди рдФрд░ рдмреИрдХрдмреЛрди рдХреЗ рдкрд╛рд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдФрд░ DOM рдореЙрдбрд▓ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдХреЛрдВ


рд╕реНрдкрд╛рдЗрди рдХрдВрдЯреНрд░реЛрд▓рд░ Spine.Class рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкрд╛рдЗрди рдореЗрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 var TweetController = Spine.Controller.create({ init:function(){ //initial logic on instantiation } }) 

рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рдЖрд░рдВрдн рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 var myTweetController = TweetController.init(); 

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ 'рдПрд▓' рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 var myTweetController = TweetController.init({el: $('#tweets')}); 

рдкреНрд░рд▓реЗрдЦрди


рдЖрдк рд╕реНрдкрд╛рдЗрди рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ , рдореЙрдбрд▓реЛрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд░реАрдврд╝ рдФрд░ рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░


рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рдкрд╣рд▓реЗ рдорд┐рдирдЯ рдореЗрдВ рдмреИрдХрдмреЛрди рдФрд░ рд╕реНрдкрд╛рдЗрди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рддреЗ рд╣реИрдВ, рд╡реЗ рдореВрд▓рднреВрдд рдЕрдВрддрд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдпреЗ рдЕрдВрддрд░ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

1. рдмреИрдХрдмреЛрди рдЕрднреНрдпрд╛рд╡реЗрджрди рдЙрдирдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ URL рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдмреЛрди рдирд┐рдпрдВрддреНрд░рдХ рдЕрдзрд┐рдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрдкрд╛рдЗрди рдореЗрдВ, рд░реВрдЯрд┐рдВрдЧ рд╕рдорд░реНрдерди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рд╣реИ), рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдмреИрдХрдмреЛрди рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред

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

3. рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдХреЗ рдЕрдВрддрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ: рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдкрд╛рдЗрди рдореЗрдВ рдореИрдкрд┐рдВрдЧ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдмреИрдХрдмреЛрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрдИ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдХрд╛рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╛рдЗрди рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╡рд╣ рд╣рд░ рддрд░рд╣ рд╕реЗ рдЬреАрддрддрд╛ рд╣реИред

рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд░реАрдврд╝


рдЙрджрд╛рд╣рд░рдг: Bit.ly рдЧреНрд░рд╛рд╣рдХ





рдЬрдм рдЖрдк рдПрд╕рдкреАрдП рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ (рдпрд╣ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдпрд╛ рдЕрдиреНрдп рдПрдкреАрдЖрдИ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рдЖрдк рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдпрд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА ajax рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдмрд┐рдЯ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЧреНрд░рд╛рд╣рдХ рдЬреЛ рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:


рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ


рдПрдХ bit.ly рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдирд╛

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ bit.ly рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 1. рдЫреЛрдЯрд╛ URL рдФрд░ 2. рдЖрдБрдХрдбрд╝реЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо ajax рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреЗрдЬрд╝ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

Store.js рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╣рд╛рдпрддрд╛

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ store.js (рдФрд░ рдпрд╣ рдХрд┐рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: json2.js) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ spine.model.local.js рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рджреА рдЧрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдиреАрдЪреЗ рджреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 Spine.Model.Local = { extended: function(){ this.sync(this.proxy(this.saveLocal)); this.fetch(this.proxy(this.loadLocal)); }, saveLocal: function(){ var result = JSON.stringify(this); //localStorage[this.name] = result; store.set(this.name, result); }, loadLocal: function(){ //var result = localStorage[this.name]; var result = store.get(this.name); if ( !result ) return; var result = JSON.parse(result); this.refresh(result); } }; 

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг jQuery рдЯреЗрдореНрдкрд▓реЗрдЯ

рд╕реНрдкрд╛рдЗрди рдФрд░ рдмреИрдХрдмреЛрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдИ рддрд░реАрдХреЛрдВ (рдорд╛рдЗрдХреНрд░реЛ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдореВрдВрдЫ.рдЬреЗ рдФрд░ рдЗрддрдиреЗ рдкрд░) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЖрдк рдЪреБрдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдиреЗ рд╣рдорд╛рд░реА рдЫреЛрдЯреА URL рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery tmpl рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдбрд┐рдЬрд╝рд╛рдЗрди


рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреА рд╕реВрдЪреА:


рдЙрджрд╛рд╣рд░рдг jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╛рдЗрди Zepto рдпрд╛ рдЕрдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреИрд╢рд┐рдВрдЧ


 var exports = this; 


рд╕рд░рд▓ jQuery рдкреНрд▓рдЧрдЗрди


 $.fn.toggleDisplay = function(bool){ if ( typeof bool == "undefined" ) { bool = !$(this).filter(":first:visible")[0]; } return $(this)[bool ? "show" : "hide"](); }; 

рдпреВрдЖрд░рдПрд▓ рдореЙрдбрд▓:


 var Url = Spine.Model.setup("Url", ["short_url", "long_url", "stats"]); Url.extend(Spine.Model.Local); Url.include({ validate: function(){ if ( !this.long_url ) return "long_url required" if ( !this.long_url.match(/:\/\//)) this.long_url = "http://" + this.long_url }, fetchUrl: function(){ if ( !this.short_url ) $.bitly(this.long_url, this.proxy(function(result){ this.updateAttributes({short_url: result}); })); }, fetchStats: function(){ if ( !this.short_url ) return; $.bitly.stats(this.short_url, this.proxy(function(result){ this.updateAttributes({stats: result}); })); } }); Url.bind("create", function(rec){ rec.fetchUrl(); }); 

Export.Urls рдирд┐рдпрдВрддреНрд░рдХ:


 exports.Urls = Spine.Controller.create({ events: { "click .destroy": "destroy", "click .toggleStats": "toggleStats" }, proxied: ["render", "remove"], template: function(items){ return $("#urlTemplate").tmpl(items); }, init: function(){ this.item.bind("update", this.render); this.item.bind("destroy", this.remove); }, render: function(){ this.el.html(this.template(this.item)); return this; }, toggleStats: function(){ this.navigate("/stats", this.item.id, true); }, remove: function(){ this.el.remove(); }, destroy: function(){ this.item.destroy(); } }); 

Export.UrlsList рдирд┐рдпрдВрддреНрд░рдХ:


 exports.UrlsList = Spine.Controller.create({ elements: { ".items": "items", "form": "form", "input": "input" }, events: { "submit form": "create", }, proxied: ["render", "addAll", "addOne"], init: function(){ Url.bind("create", this.addOne); Url.bind("refresh", this.addAll); }, addOne: function(url){ var view = Urls.init({item: url}); this.items.append(view.render().el); }, addAll: function(){ Url.each(this.addOne); }, create: function(e){ e.preventDefault(); var value = this.input.val(); if (value) Url.create({long_url: value}); this.input.val(""); this.input.focus(); } }); 

рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред


 exports.Stats = Spine.Controller.create({ events: { "click .back": "back" }, proxied: ["change", "render"], init: function(){ Url.bind("update", this.render); }, template: function(items){ return $("#statsTemplate").tmpl(items); }, render: function(){ if ( !this.item ) return; this.el.html(this.template(this.item)); }, change: function(item){ this.item = item; this.navigate("/stats", item.id); this.item.fetchStats(); this.render(); this.active(); }, back: function(){ this.navigate("/list", true); } }); 

Export.UrlApp рдирд┐рдпрдВрддреНрд░рдХ:


 exports.UrlApp = Spine.Controller.create({ el: $("body"), elements: { "#urls": "urlsEl", "#stats": "statsEl" }, init: function(){ this.list = UrlsList.init({el: this.urlsEl}); this.stats = Stats.init({el: this.statsEl}); this.manager = Spine.Controller.Manager.init(); this.manager.addAll(this.list, this.stats); this.routes({ "": function(){ this.list.active() }, "/list": function(){ this.list.active() }, "/stats/:id": function(id){ this.stats.change(Url.find(id)) } }); Url.fetch(); Spine.Route.setup(); } }); 

рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ 'рдРрдк' рдХреЗ рдЖрд░рдВрдн рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 exports.App = UrlApp.init(); 

URL рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ Bit.ly рдХреЗ рд▓рд┐рдП рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ


 (function($){ var defaults = { version: "3.0", login: "legacye", apiKey: "R_32f60d09cccde1f266bcba8c242bfb5a", history: "0", format: "json" }; $.bitly = function( url, callback, params ) { if ( !url || !callback ) throw("url and callback required"); var params = $.extend( defaults, params ); params.longUrl = url; return $.getJSON("http://api.bit.ly/shorten?callback=?", params, function(data, status, xhr){ callback(data.results[params.longUrl].shortUrl, data.results[params.longUrl], data); }); }; $.bitly.stats = function( url, callback, params ) { if ( !url || !callback ) throw("url and callback required"); var params = $.extend( defaults, params ); params.shortUrl = url; return $.getJSON("http://api.bitly.com/v3/clicks?callback=?", params, function(data, status, xhr){ callback(data.data.clicks[0], data); }); }; })(jQuery); 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдбреЗрдХреНрд╕ / HTML:


LABjs рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВред

 <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="css/application.css" type="text/css" charset="utf-8"> <script src="lib/LAB.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $LAB .script("lib/json.js") .script("lib/jquery.js") .script("lib/jquery.tmpl.js") .script("lib/jquery.bitly.js") .script("lib/store.min.js") .script("lib/spine.js") .script("lib/spine.model.local.js") .script("lib/spine.controller.manager.js") .script("lib/spine.route.js") .script("app/models/url.js") .script("app/application.js"); </script> <script type="text/x-jquery-tmpl" id="urlTemplate"> <div class="item"> <div class="show"> <span class="short"> ${long_url} </span> <span class="long"> {{if short_url}} <a href="${short_url}">${short_url}</a> {{else}} Generating... {{/if}} </span> <a class="toggleStats"></a> <a class="destroy"></a> </div> </div> </script> <script type="text/x-jquery-tmpl" id="statsTemplate"> <div class="stats"> <a class="back">Back</a> <h1>Click Statistics</h1> <h1 class="longUrl">${long_url}</h1> <p>Short URL: {{if short_url}} <a href="${short_url}">${short_url}</a> {{else}} Generating... {{/if}} </p> {{if stats}} <p>Global clicks: ${stats.global_clicks}</p> <p>User clicks: ${stats.user_clicks}</p> {{else}} Fetching... {{/if}} </div> </script> </head> <body> <div id="views"> <div id="urls"> <h1>Bit.ly Client</h1> <form> <input type="text" placeholder="Enter a URL"> </form> <div class="items"></div> </div> <div id="stats"> </div> </div> </body> </html> 

рдиреЛрдЯ:



рд╡рд╣ рд╕рдм рд╣реИ!

рдкрд░рд┐рдгрд╛рдо
рд╕реНрд░реЛрдд рдХреЛрдб

рдирд┐рд╖реНрдХрд░реНрд╖


рд░реАрдврд╝ рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдЕрдкрдиреЗ рджрдо рдкрд░ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА:

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


All Articles