ä»æ¥ãJavaScriptãã¬ãŒã ã¯ãŒã¯ã®ãããªå€é¢çã§ç©è°ãéžããããã¯ã«è§Šãããã£ãã éå»æ°ãæã«ããã£ãŠãåºç瀟ã¯Angular.jsãšKnockout.jsã®äž¡æ¹ã§æžç±ãåºçããèŠéãã«ã€ããŠç¹°ãè¿ãè°è«ããŠããŸããããæšå¹ŽBackbone.jsã§æžç±ãåºçããŸãã ã 次ã®è³æã¯ãããŸããŸãªJavaScriptãã¬ãŒã ã¯ãŒã¯ã®é·æãšçæãç解ããã®ã«åœ¹ç«ã€ããšãç®çãšããŠããŸãã ãããããèšäºãèªãã åŸãèªè ã¯ãããã®ãã¬ãŒã ã¯ãŒã¯ãéåžžã«äŒŒãŠãããã©ããããããŠãã®ã¬ãã¥ãŒã§èšåãããŠããæè¡ã®ããã€ããããã«ç 究ããããã©ããã«ã€ããŠã®è³ªåã«çããã®ãç°¡åã«ãªãã§ãããã ãããã®ãã¬ãŒã ã¯ãŒã¯ã«é¢ããæ°ããæ¬ãå¿ èŠãã©ããããããããªããã©ã®æ¬ã«ã€ããŠã®ããªãã®èããå ±æãããããé¡ãããŸãïŒã³ã¡ã³ãã§è©±ããæ¬ãžã®ãªã³ã¯ãæäŸããããšãheããªãã§ãã ããïŒã
MV *ã«ããŽãªããJavaScriptãã¬ãŒã ã¯ãŒã¯ããã°ããåŠç¿ããã«ã¯ããã¬ãŒã ã¯ãŒã¯ãäžé£ã®å¯èœæ§ãšããŠæ瀺ã§ããããšãéèŠã§ãã MV *ã¢ããªã±ãŒã·ã§ã³ã®äž»ãªæ©èœã¯ãã«ãŒãã£ã³ã°ãããŒã¿ãã€ã³ãã£ã³ã°ããã³ãã¬ãŒã/ãã¥ãŒãã¢ãã«ãããã³ããŒã¿ã¹ãã¬ãŒãžã§ãã ãã®åºçç©ã§ã¯ããããã®æ©èœã«ã€ããŠèª¬æãã2ã€ãŸãã¯3ã€ã®ãã¬ãŒã ã¯ãŒã¯ã§ãããã®åæ©èœã®å®è£ ã³ãŒãã瀺ããŸãã ãŸããåãã¬ãŒã ã¯ãŒã¯ãæé©åããç¹å®ã®ã¿ã¹ã¯ã®ãœãªã¥ãŒã·ã§ã³ãå ·äœçã«åæããŸãããã®åŸãããããã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã®éããããé¡äŒŒç¹ãå€ãããšã«æ°ã¥ãããšãé¡ã£ãŠããŸãã ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã§æ£åœåãããæ©èœãç©æ¥µçã«åãå ¥ããããŠããããšãããããŸãã
ç§ã¯äººã®éããããé¡äŒŒç¹ãèŠãããšæã£ãŠããŸã-Isabel Allende
ã³ãŒãã®åè¡ã解æããå¿ èŠã¯ãããŸããã ãšããããããããã®ãã¬ãŒã ã¯ãŒã¯ãã©ã®ãããªãã®ã«äŒŒãŠããã®ãããããžã§ã¯ãã§ã©ã®ãããªåé¡ã解決ã§ããã®ããè©äŸ¡ããŠã¿ãŠãã ããã
ã«ãŒãã£ã³ã°
å°ãªããšããã«ãŒãã£ã³ã°ã¯URLãã¢ã¯ã·ã§ã³ã«ãããã³ã°ããŸããããã¥ãŒå ã®ç¶æ éã®é·ç§»ãå¶åŸ¡ããããã«å®å šãªãç¶æ ãã·ã³ããã¿ãŒã³ãå®è£ ããããšã«ãªãå ŽåããããŸãã
ããšãã°ãRailsãCodeIgniterãCakePHPãASP.NET MVCãSpring MVCãJSFãSTRUTSãGrailsãªã©ã®ãµãŒããŒMVCãã¬ãŒã ã¯ãŒã¯ã§ã«ãŒã¿ãŒã䜿çšããããšãããå ŽåãJavaScript MV *ã«ãŒã¿ãŒãåæ§ã®ãã®ãšèŠãªãããšãã§ããŸãããšã³ãã£ãã£ã§ãããJavaScriptã䜿çšããŠã¯ã©ã€ã¢ã³ãäžã§å®è¡ãããµãŒããŒã³ãŒããžã®éãéããŸãããµãŒããŒã³ãŒãã¯ãPHPãRubyãJavaãCïŒãªã©ã§èšè¿°ã§ããŸãã
çåãçããå¯èœæ§ããããŸãïŒå€ããã©ãŠã¶ãŒã§ã¯ããããã¯ãã¹ãŠã©ã®ããã«æ©èœããŸãã ãã®ã¡ã«ããºã ã¯ããã©ã«ãã§æ©èœããããã·ã¥ã¿ã°ã®åŸã®URLã«ãããã¹ãŠã®æ å ±ãã«ãŒããšããŠäœ¿çšããŸãã 確ãã«ãããã·ã¥ç¶æ ã®ãµããŒããHTMLã§æ§æãããŠããå ŽåïŒã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããã¯1è¡ã®ã³ãŒãã§è¡ãããŸãïŒãã«ãŒãã«äžèŽããããã·ã¥ã®ãªãURLã¯ã¯ã©ã€ã¢ã³ãã§ã€ã³ã¿ãŒã»ãããããJavaScriptã³ãŒããå®è¡ãããŸãã
ããã·ã¥ç¶æ ã¯ããã©ã«ãã§ã¯ãµããŒããããŠããŸãããããã¯ããŒã¯ãä»ããŠçŽæ¥ãªã¯ãšã¹ããããURLãŸãã¯é»åã¡ãŒã«ã¡ãã»ãŒãžã§éä¿¡ãããURLã¯ãšã³ããŠãŒã¶ãŒã®ã³ã³ãã¥ãŒã¿ãŒã§åäœããã«ãããããããæ€çŽ¢ãšã³ãžã³ã¯JavaScriptã§ã®åäœã«ããŸãé©ããŠããŸãã ã€ãŸããããããã¯JavaScriptã³ãŒããå®è¡ããªãå¯èœæ§ããããããããŒãžã®å®éã®ã³ã³ãã³ãã衚瀺ã§ããŸããã
ãã®ãããªå Žåã«éåžžæäŸããããœãªã¥ãŒã·ã§ã³ã¯ããµãŒããŒäžã§PhantomJSãŸãã¯å¥ã®è»œéãã©ãŠã¶ãŒãèµ·åããããŒãžãšJavaScriptã匷å¶çã«èªã¿èŸŒã¿ãçæãããããŒã¯ã¢ãããJavaScriptãšãšãã«è¿ãããšã§ãã ãã®ã¡ã«ããºã ãæ§æããã«ã¯ãäžçæžåœäœæ¥ããå¿ èŠããããŸãããã®ããããã¹ãŠã®ãã©ãŠã¶ãŒã§ãµããŒããããŠããããã·ã¥ã¿ã°ä»ãã®URLã«å¯ŸããŠããã©ã«ãã§èšå®ãããŠããŸãã
ååãªèª¬æã¯ãã³ãŒãã«è¡ããŸãã
ããã¯ããŒã³ã®äŸ
Backbone.jsã®ç°¡åãªã«ãŒãã£ã³ã°ã®äŸã次ã«ç€ºããŸã
var HomeView = Backbone.View.extend({ template: '<h1>Home</h1>', initialize: function () { this.render(); }, render: function () { this.$el.html(this.template); } }); var AboutView = Backbone.View.extend({ template: '<h1>About</h1>', initialize: function () { this.render(); }, render: function () { this.$el.html(this.template); } }); var AppRouter = Backbone.Router.extend({ routes: { '': 'homeRoute', 'home': 'homeRoute', 'about': 'aboutRoute', }, homeRoute: function () { var homeView = new HomeView(); $("#content").html(homeView.el); }, aboutRoute: function () { var aboutView = new AboutView(); $("#content").html(aboutView.el); } }); var appRouter = new AppRouter(); Backbone.history.start();
ç¹ã«ãAppRouterãªããžã§ã¯ãã«æ³šæããŠãã ããã ã«ãŒãã¯æ©èœã«ããããããŸãã é¢æ°ã¯ãDOMã¢ãã«ã®ãã©ã°ã¡ã³ãã管çãããã¥ãŒãªããžã§ã¯ããäœæããURLãå€æŽããããšããã«ããŒãžã«è¿œå ããŸãã Backbone.history.startïŒïŒé¢æ°ã¯ãURLã®å€æŽã®ãªãã¹ã³ãéå§ããããBackboneã«æ瀺ããŸãã
AngularJSã®äŸ
以äžã¯ãAngularJSã®ç°¡åãªã«ãŒãã£ã³ã°ã®äŸã§ãã
var routingExample = angular.module('FunnyAnt.Examples.Routing', []); routingExample.controller('HomeController', function ($scope) {}); routingExample.controller('AboutController', function ($scope) {}); routingExample.config(function ($routeProvider) { $routeProvider. when('/home', { templateUrl: 'embedded.home.html', controller: 'HomeController' }). when('/about', { templateUrl: 'embedded.about.html', controller: 'AboutController' }). otherwise({ redirectTo: '/home' }); });
AngularJSã®äŸã¯ãBackboneã«éåžžã«äŒŒãŠããŸãããã«ãŒããtemplateUrlããã³ã³ã³ãããŒã©ãŒã¯ã©ã¹ã«ããããããç¹ãç°ãªããŸãïŒãã®ã³ã³ããã¹ãã§ã¯ãã³ã³ãããŒã©ãŒã¯Backboneãã¥ãŒã«äŒŒãŠããŸãïŒã
ãšã³ããŒã®äŸ
以äžã¯ãEmberã®ç°¡åãªã«ãŒãã£ã³ã°ã®äŸã§ãã
App.Router.map(function() { // this.route('home', { path: '/' }); this.route('about'); });
ç¹°ãè¿ããŸããããã®äŸã¯ä»¥åã®äŸãšéåžžã«äŒŒãŠããŸãããEmber.jsã§ã¯ãã«ãŒã¿ãŒã®ããªãœãŒã¹ããªããžã§ã¯ãã®æåã®ãã©ã¡ãŒã¿ãŒã¯routeNameã§ããã2çªç®ã¯URLã§ãã æåã¯ããã®äŸã®aboutããŒãžã®å Žåã®ããã«ãpathãã©ã¡ãŒã¿ãŒããªãã·ã§ã³ã§ãããå€ãã®å Žååæã«ãã£ãŠèšå®ã§ãããšèª°ãã瀺åãããŸã§ããã®é åºä»ãã¯ç§ãæ··ä¹±ãããŸããã ããã«ããã®åçŽãªã«ãŒãã£ã³ã°ã®äŸãå®è¡ããã«ã¯ãã³ãã¬ãŒããå¿ èŠã§ãããèšäºã®æåŸã§ã®ã¿çŠç¹ãåœãŠãŸãã ä»ã®ãšããããã³ãã¬ãŒãã{{outlet}}èŠçŽ ã«é 眮ãããŠããããšãç¥ãã ãã§ååã§ãã Emberã«ãŒã¿ãŒã¯ããã³ãã¬ãŒãã®ãã¹ããªã©ãæ¯èŒçè€éãªæ©èœã䜿çšããããšã«æ³šæããŠãã ããããã ããããã§ã¯ãä»ã®ã©ã€ãã©ãªãšæ©èœçã«é¡äŒŒããŠããããšã瀺ããŸãã
ã«ãŒãã£ã³ã°ããã ã
ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ã«ãŒãã£ã³ã°ãœãªã¥ãŒã·ã§ã³ããããŸãããKnockout.jsã¯ããŒã¿ãã€ã³ãã£ã³ã°ã«çŠç¹ãåœãŠãŠãããã«ãŒãã£ã³ã°ã®ã¿ãç®çãšããJavaScriptã©ã€ãã©ãªã®1ã€ã䜿çšããæåã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã ãã®çš®ã®æãäžè¬çãªç¹æ®ã©ã€ãã©ãªã¯ãSummyJSãšHistoryJSã§ãã SummyJSã¯ãHTML5ã®History APIããµããŒããããã©ãŠã¶ãŒãããã³ã¬ã¬ã·ãŒãã©ãŠã¶ãŒïŒIE 8以äžïŒã®URLããã·ã¥ã§åäœããŸãã HistoryJSã©ã€ãã©ãªã¯å°ãããªããŸãããHTML5ã®History APIã®ã¿ããµããŒãããŸãã
ããŒã¿ãã€ã³ãã£ã³ã°
ãã€ã³ãã£ã³ã°ã䜿çšãããšããã¥ãŒã§æŽæ°ããããŒã¿ã¢ãã«ãå€æŽãããããã¥ãŒã«å ããããå€æŽã§ã¢ãã«ãèªåçã«æŽæ°ãããã§ããŸããããã«ã¯è¿œå ã®ã³ãŒãã¯äžèŠã§ãã åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã¯ãéåžžãã¢ãã«ãžã®å€æŽããã¥ãŒã«äŒæãããããšãæå³ããŸãã åæ¹åã®ããŒã¿ãã€ã³ãã£ã³ã°ã§ã¯ããã¥ãŒã«å ãããããã¹ãŠã®å€æŽãã¢ãã«ã«ãã°ããåæ ããè¿œå ã®æ©äŒããããŸãã ããŒã¿ãã€ã³ãã£ã³ã°ã«ãããéçºè ãéåžžèšè¿°ããå¿ èŠã®ãã倧éã®ã¹ãã¬ãªã¿ã€ãã³ãŒããç¯çŽã§ããŸãã ãããã£ãŠãããã°ã©ãã¯ããã®ã¢ããªã±ãŒã·ã§ã³ã«åºæã®åºæã®ã¿ã¹ã¯ã解決ããããšã«éäžã§ããŸãã
AngularJSã®äŸ
以äžã¯ãAngularJSã§ã®åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã®ç°¡åãªäŸã§ãã å ¥åãã£ãŒã«ãã«å ¥åãããšããŠã§ã«ã«ã ã¡ãã»ãŒãžã®çŽåŸã«è¡šç€ºãããŸãã
<h1>Simple Data Binding with AngularJS</h1> <br /> <div ng-app> Name: <input type="text" ng-model="name" /> <br /><br /> Welcome to AngularJS {{name}} </div>
KnockoutJSã䜿çšããäŸ
KnockoutJSãã¬ãŒã ã¯ãŒã¯ã¯å®éã«ããŒã¿ãã€ã³ãã£ã³ã°ã«ã®ã¿çŠç¹ãåœãŠãŠãããç¹ã«ãã£ã¹ãã¬ã€ç®¡ççšã®DurandalJSããã³ã«ãŒãã£ã³ã°åŠççšã®History.jsãŸãã¯Sammy.jsãšãšãã«ãä»ã®ãã¬ãŒã ã¯ãŒã¯ããã³ã©ã€ãã©ãªãšäžç·ã«æé©ãªãœãªã¥ãŒã·ã§ã³ã®äžéšãšããŠäœ¿çšãããŸãã KnockoutJSã§ã®ããŒã¿ãã€ã³ãã£ã³ã°ã®äŸã次ã«ç€ºããŸãã
// var ViewModel = function(name) { this.name = ko.observable(name); }; ko.applyBindings(new ViewModel("")); // Knockout
ããã¯ããŒã³ã®äŸ
Backboneã«ã¯èªåããŒã¿ãã€ã³ãã£ã³ã°ã¯ãããŸããããæåã§è¡ãããšãã§ããŸãã ç§ã®çµéšã§ã¯ãã¢ãã«ã«å ããããå€æŽã«å¿ããŠãã¥ãŒãæŽæ°ãããåæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã¯éåžžã«äŸ¿å©ã§ãã ãã¥ãŒããã¢ãã«ãžã®åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã®å®éã®ã±ãŒã¹ã¯ããŸãäžè¬çã§ã¯ãããŸããïŒããšãã°ããŠãŒã¶ãŒãããã¹ããšãã£ã¿ãŒã§å ¥åããããã¹ãã®ã©ã€ããã¬ãã¥ãŒãå®è£ ããå ŽåïŒã å®éããã¥ãŒããã¢ãã«ãžã®ãªã³ã¯ã¯æçšã§ãããå€ãã®å Žåããã¥ãŒãå€æŽããçç±ã¯ãŠãŒã¶ãŒãå ¥åããæ å ±ã§ããããããã®å€æŽãã¢ãã«ã«å ããããåã«ä»ã®ããžãã¯ãå®è£ ããæéãå¿ èŠã§ãã ããšãã°ãå ¥åã®æ€èšŒããªã¹ãã®ãã£ã«ã¿ãªã³ã°ã«ã€ããŠè©±ãããšãã§ããŸãããããã«ã¯çŸåšã®ãã£ã«ã¿ãŒãèŠããŠããå¿ èŠããããŸãã 以äžã¯ãäž¡æ¹ã®ãã€ã³ãã£ã³ã°ãªãã·ã§ã³ãå®è£ ããç°¡åãªã³ãŒãäŸã§ãã
var MessageView = Backbone.View.extend({ template: _.template($('#message-template').html()), events: { 'keyup #name': 'updateModel' }, updateModel: function(event) { this.model.set({name:$("#name").val()}); }, initialize: function() { this.listenTo(this.model, "change", this.render); this.render(); }, render: function() { this.$('#message').html(this.template(this.model.toJSON())); return this; } }); var person = new Backbone.Model({name:''}); messageView = new MessageView({el: $('#message-container') ,model: person});
ãã®ãããã¢ãã«ã§çºçããå€æŽã€ãã³ãããªãã¹ã³ãããã¥ãŒã®renderããããã£ãåŒã³åºããŠãã¢ãã«ããã¥ãŒãæŽæ°ããããã«ããŸãã åæ§ã«ãã¢ãã«ãå ¥åããã³å€æŽãããšãã«ããŒã¢ããã€ãã³ãããªãã¹ã³ããjQueryã䜿çšããŠå ¥åããç®çã®å€ãååŸããã¢ãã«ã«èšå®ããŠããã¥ãŒãã¢ãã«ãæŽæ°ããããã«ããŸãã ãã®äŸã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãæ©èœããããã«å¿ èŠãªã³ãŒãã®éã®å°è±¡ãäžããã®ã«åœ¹ç«ã¡ãŸãã ãŸããBackboneã§ã®ããŒã¿ãã€ã³ãã£ã³ã°ããµããŒãããå€æ°ã®ãã©ã°ã€ã³ã®ååšã«èšåããå¿ èŠããããŸãã
ãšã³ããŒã®äŸ
Emberã®ããŒã¿ãã€ã³ãã£ã³ã°ã¯æ¬¡ã®ããã«ãªããŸãã
App = Ember.Application.create({});
Emberãã¬ãŒã ã¯ãŒã¯ã§ã¯ã䜿ãæ £ãããã³ãã«ããŒãªããžã§ã¯ãã䜿çšããŠãã³ãã¬ãŒããäœæããŸãããã»ãšãã©ã®ãã©ãŒã ã«ããå ¥åãã£ãŒã«ããžã®ãã€ã³ããæäŸãããå ¥åã¢ã·ã¹ã¿ã³ãããå«ãŸããŠããŸãã ãã®äŸã§ã¯ãäžæ¬åŒ§{{å ¥åæ<è§åºŠã眮æãããååãããããã£ã«åŒçšç¬Šããªããããã¢ã·ã¹ã¿ã³ãã¯ã¢ã¿ããããå¿ èŠãããããšãèªèããŠããŸãã Emberãã¬ãŒã ã¯ãŒã¯ã¯ãAngularJSãšåæ§ã«ãæå°éã®ã³ãŒãã§åæ¹åãã€ã³ãã£ã³ã°ãæäŸããŸãã
ãã³ãã¬ãŒã/ãã¥ãŒ
ãã³ãã¬ãŒãã¯HTMLããŒãžå šäœã«å¯Ÿå¿ã§ããŸãããå€ãã®å Žåããã³ãã¬ãŒãã¯å°ããªãã©ã°ã¡ã³ãã§ãããå°æ¥ã®åçããŒã¿ã®ãã¬ãŒã¹ãã«ããŒã«æ¢è£œã®ãã€ã³ãã£ã³ã°ãæã€ãã¬ãŒã¹ãã«ããŒåŒãå«ãŸããŸãã ãããã«ã¯ããžãã¯ãå«ãŸããŠããªãå¯èœæ§ããããŸã-è¡šçŸã«ããã°ã©ã ããžãã¯ãå«ããã¹ãã§ã¯ãªãããŸãã¯æå°éã«æããããšãã§ãããšããå²åŠããããŸãã äžéšã®ãã³ãã¬ãŒãã¯ãJavaScriptã³ãŒããçŽæ¥åã蟌ãããšãã§ããŸãã ãã³ãã¬ãŒãã¯DOMã¢ãã«ã«åºã¥ããŠãããDOMã䜿çšããŠåçããŒã¿ããªã³ã¶ãã©ã€ã§æ¿å ¥ããããHTMLã®æåå解éã«äœ¿çšãããã§ããŸããHTMLæååã¯åçèŠçŽ ããã°ãã眮ãæããããã«äœ¿çšãããŸãã
ãã³ãã¬ãŒãã©ã€ãã©ãª
æšæºåã«åœ¹ç«ã€ã©ã€ãã©ãªã®äžã§ãæã人æ°ã®ããHandlebar.jsãšããååãä»ããå¿ èŠããããŸãã Handlebar.jsã¯Backbone.jsã§ãã䜿çšãããEmber.jsã®äžéšã§ãïŒEmber.jsã§ä»ã®ãã³ãã¬ãŒãã©ã€ãã©ãªã䜿çšã§ããŸããããã®å Žåãããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããããããå§ãããŸããïŒã ãã1ã€ã®äººæ°ã®ãããã³ãã¬ãŒããšã³ãžã³ã¯ãMustache.jsãšåŒã°ããŸãã UnderscoreJSã¯ãBackbone.jsãã¬ãŒã ã¯ãŒã¯ã«é¢é£ä»ããããè£å©ã©ã€ãã©ãªã§ãããç¹ã«ãã³ãã¬ãŒãã©ã€ãã©ãªãããã³é¢æ°åããã°ã©ãã³ã°ã®ããã®å€ãã®è³æãå«ãŸããŠããŸãã ãã®åéã§æ³šç®ãéããŠããã®ãDust.jsã©ã€ãã©ãªã§ãLinkedInãæè¿ã¢ããªã±ãŒã·ã§ã³ãããã°ã©ã ããããã«æ¡çšããŸããã ããã«ãHandlebar.jsããã³Mustache.jsã©ã€ãã©ãªã¯ãéçºè ãã¯ã©ã€ã¢ã³ãã§ãã³ãã¬ãŒããäœæããã ãã§ããããšã«æ°ã¥ãããšãã«ãjQueryããã³AJAXã®ã¿ïŒJavaScript MVCãªãïŒã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã§ãã䜿çšãããŸãã jQueryã®äžéšãšããŠãç¬èªã®ãã³ãã¬ãŒãã©ã€ãã©ãªãéçºãããŸããããçŸæç¹ã§ã¯æ¢ã«æãŸãããªããšèªèãããŠããããã䜿çšããããšã¯ãå§ãããŸããã
ã¢ã³ããŒã¹ã³ã¢ã®èµ·æº
BackboneJSã®äœæè ã§ããJeremy AshkenasãBackboneJSããå ã®ããŒãžã§ã³ããUnderscoreJSãæœåºãããšãã«ãã¹ãŠãå§ãŸããŸãããããã«ãããBackboneJSããåé¢ããŠäŸ¿å©ãªè£å©æ©èœã䜿çšã§ããŸãã
ããã€ãã®äŸãèŠãŠã¿ãŸãããã
AngularJSã®äŸ
以äžã¯ãAngularJSã®ç°¡åãªãã³ãã¬ãŒãã®äŸã§ãã
var templatesExample = angular.module('FunnyAnt.Examples.Templates', []); templatesExample.controller('HomeController', function ($scope) { $scope.greeting = "Welcome to the application."; }); templatesExample.controller('AboutController', function ($scope) { $scope.content = "As a software developer, I've always loved to build things..."; }); templatesExample.config(function ($routeProvider) { $routeProvider. when('/home', { templateUrl: 'embedded.home.html', controller: 'HomeController' }). when('/about', { templateUrl: 'embedded.about.html', controller: 'AboutController' }). otherwise({ redirectTo: '/home' }); });
ããããããã®ã³ãŒãã以åã®ã«ãŒãã£ã³ã°äŸã®ããã«èŠããããšã«æ°ã¥ããã§ãããã ããã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãã³ãã¬ãŒããã©ã®ããã«åœ¹ç«ã€ããç解ã§ããããã«ãããŒã¿ãã€ã³ãã£ã³ã°ã®ã¿ãè¿œå ãããŠããŸãã ãã³ãã¬ãŒããã¡ã€ã³HTMLãã¡ã€ã«ã®ã¹ã¯ãªããã¿ã°ã«å«ãããšããµã³ãã«ãéæã«ãªããjsfiddle.netã§äœ¿çšã§ããããã«ãªããŸããããã³ãã¬ãŒãã¯ãAngular.jsã®ä»»æã®è¡šçŸã®å€éšã«é 眮ã§ããŸãã åŸè ã®å Žåã$ routeProviderã®æ§æ段éã§ãtemplateUrlããããã£ã«æå¹ãªãã¡ã€ã«ãã¹ãæå®ããã ãã§ãã
倧èŠæš¡ã¢ããªã±ãŒã·ã§ã³ïŒããã©ãŒãã³ã¹ãéåžžã«éèŠïŒã§ãã³ãã¬ãŒããåŠçãã奜ãŸããæ¹æ³ã¯ãAngularJSãã³ãã¬ãŒããã³ã³ãã€ã«æã«Angular $ templateCacheã®åŸç¶ã®ç»é²ã«ãªã³ã¯ããããšã§ãããã¢ã»ã³ããªã¿ã¹ã¯ã¯æ¬¡ã®ããã«å®åŒåãããããšã«èšåãã䟡å€ããããŸãã
ãšã³ããŒã®äŸ
以äžã¯ãEmberã§ãã³ãã¬ãŒãã䜿çšããäŸã§ãã
App = Ember.Application.create({}); App.Router.map(function() { // this.resource('home', { path: '/' }); this.resource('about', {path: '/about'}); }); App.HomeRoute = Ember.Route.extend({ model:function(){ return{ greeting: 'Welcome to the application.' } } }); App.AboutRoute = Ember.Route.extend({ model: function(){ return{ pagecontent: 'As a software developer, I have always loved to build things...' }; } });
Emberã«ãŒãã¯ã衚瀺ããã¢ãã«ãã€ãŸãURLã§ã¯ãªãã¢ãã«ããã³ãã¬ãŒãã«äŒãããªããžã§ã¯ãã§ãã ããã¯ããã³ãã¬ãŒããšãªãœãŒã¹ïŒURLïŒã®æãåçŽãªã³ã³ãããŒã©ãŒãšèŠãªãããšãã§ãããã®äž»ãªã¿ã¹ã¯ã¯ã¢ãã«ãããŒãããããšã§ãã ããã§ååã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãä¿åããå¿ èŠãããå Žåã¯ãå®å šãªã³ã³ãããŒã©ãŒãå¿ èŠã§ãã
Emberããã³AngularJSãã¬ãŒã ã¯ãŒã¯ã¯ãããããæååã¢ãã«ãšDOMã¢ãã«ãšããç°ãªãæ¹æ³ã§ãã³ãã¬ãŒããæäœããŸãã ãã ããã©ã¡ãã®å Žåãåãåé¡ã¯è§£æ±ºãããŸãã ããã«ãéçºè ã«ãã£ãŠæäŸãããã€ã³ã¿ãŒãã§ã€ã¹ãšã³ã³ãã©ã¯ãã¯éåžžã«äŒŒãŠããŸãã 詳现ãããå°ã詳ããèŠãŠãããšãäž¡æ¹ã®ãã¬ãŒã ã¯ãŒã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãšã¹ã¯ãªããã¿ã°ã®ãã³ãã«ããŒæ§æããŸãã¯ãã³ãã¬ãŒããä¿åããããã®åå¥ã®ãã¡ã€ã«ã䜿çšããŠããããšã«æ³šæããŠãã ããã
ããã¯ããŒã³ã®äŸ
次ã«ãBackboneã§ãã³ãã¬ãŒããæäœããç°¡åãªäŸãèŠãŠã¿ãŸãããã
var HomeView = Backbone.View.extend({ template: _.template($("#home-template").html()), initialize: function () { this.render(); }, render: function () { this.$el.html(this.template({greeting:"Welcome to Backbone!"})); } }); var AboutView = Backbone.View.extend({ template: _.template($("#about-template").html()), initialize: function () { this.render(); }, render: function () { this.$el.html(this.template({content:"As a software developer, I've always loved to build things..."})); } }); var AppRouter = Backbone.Router.extend({ routes: { '': 'homeRoute', 'home': 'homeRoute', 'about': 'aboutRoute', }, homeRoute: function () { var homeView = new HomeView(); $("#content").html(homeView.el); }, aboutRoute: function () { var aboutView = new AboutView(); $("#content").html(aboutView.el); } }); var appRouter = new AppRouter(); Backbone.history.start();
ããã¯ä¿®æ£ãããã«ãŒãã£ã³ã°ã®äŸã§ãã ãã®å ŽåãHTMLã¯ãã¥ãŒãªããžã§ã¯ãã®ãã³ãã¬ãŒãããããã£ã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸããã ããŒã¯ã¢ããã¯ãidå±æ§ãæã€ã¹ã¯ãªããã¿ã°ã§å²ãŸããHTMLããŒãžäžã«ãããŸãïŒãã©ãŠã¶ãŒã¯ãã¿ã€ããäžæãªã¹ã¯ãªããã¿ã°ïŒç¹ã«ããã¹ã/ãã³ââãã¬ãŒãïŒãç¡èŠããããããã³ãã¬ãŒãèªäœã¯è¡šç€ºãããŸããïŒã ãã³ãã¬ãŒãïŒHTMLãã©ã°ã¡ã³ãïŒãååŸããã«ã¯ãjQueryã»ã¬ã¯ã¿ãŒã䜿çšããŸããjQueryã»ã¬ã¯ã¿ãŒã䜿çšããŠãã¹ã¯ãªããã¿ã°ã®IDã§èŠçŽ ãèŠã€ããããããinnerHTMLãéžæãããã®HTMLããã¬ãŒã³ããŒã·ã§ã³ãªããžã§ã¯ãã®ãã³ãã¬ãŒãããããã£ã«å²ãåœãŠãŸãïŒããã¯åãªãæååã§ãïŒã
ãã³ãã¬ãŒããéåžžã®htmlè¡ã®ããã«åŠçããããã®ã¢ãããŒãã䜿çšãããšãBackboneã¢ããªã±ãŒã·ã§ã³ã®å®å šã«æ°ããã©ã€ãã©ãªãæ¢åã®ã©ã€ãã©ãªã«çœ®ãæããæ¹æ³ãç°¡åã«æ³åã§ããŸãã ãã³ãã¬ãŒãããããã£ã®å®è£ ããããã«å€æŽããã ãã§ãã
ããšãã°ãã¢ã³ããŒã¹ã³ã¢ã®ä»£ããã«Handlebarsãã³ãã¬ãŒãã©ã€ãã©ãªã䜿çšããã«ã¯ã次ã®ããã«ãã¥ãŒã®ãã³ãã¬ãŒãããããã£ãæŽæ°ããŸãã
template: Handlebars.compile( $("#home-template").html() ),
...次ã«ããã³ãã¬ãŒãã§äœ¿çšããããã€ã³ãã£ã³ã°æ§æãæŽæ°ããŸããããšãã°ã
{{greeting}}
ã¢ããªã±ãŒã·ã§ã³ã§1ã€ã®ãã³ãã¬ãŒãã©ã€ãã©ãªãå¥ã®ãã³ãã¬ãŒãã©ã€ãã©ãªã«çœ®ãæããããã«å¿ èŠãªããšã¯ããã ãã§ãã
ããã¯ãhandlebar.jsã©ã€ãã©ãªããã³ãã¬ãŒãã«äœ¿çšãããå®å šãªäŸã§ãã
var HomeView = Backbone.View.extend({ template: Handlebars.compile( $("#home-template").html() ), initialize: function () { this.render(); }, render: function () { this.$el.html(this.template({greeting:"Welcome to Backbone!"})); } }); var AboutView = Backbone.View.extend({ template: Handlebars.compile( $("#about-template").html() ), initialize: function () { this.render(); }, render: function () { this.$el.html(this.template({content:"As a software developer, I've always loved to build things..."})); } }); var AppRouter = Backbone.Router.extend({ routes: { '': 'homeRoute', 'home': 'homeRoute', 'about': 'aboutRoute', }, homeRoute: function () { var homeView = new HomeView(); $("#content").html(homeView.el); }, aboutRoute: function () { var aboutView = new AboutView(); $("#content").html(aboutView.el); } }); var appRouter = new AppRouter(); Backbone.history.start();
ãã®å Žåãããã€ãã®æŠå¿µãä»ã®æŠå¿µãšæ確ã«åºââå¥ããããšã¯å®¹æã§ã¯ãããŸããã ãã³ãã¬ãŒãã«ã€ããŠè©±ããšãå€ãã®å°é家ããã³ãã¬ãŒãã©ã€ãã©ãªã®ããã©ãŒãã³ã¹ãæ·±ãæãäžããŸããããã¯ãäžèšã§èª¬æããããŒã¿ãã€ã³ãã£ã³ã°ã«å€§ããé¢é£ããŸããããã³ãã¬ãŒãã®èªã¿èŸŒã¿ã«ãé©çšãããŸãïŒããã«JavaScriptã§ã®äºåã³ã³ãã€ã«ãªã©ïŒã
ããããæ··ä¹±ã«å ããŠãäžèšã®ãã³ãã¬ãŒãã¯åãªãHTMLã§ãããMVCãæ±ãå€ãã®ãµãŒããŒåŽéçºè ã¯HTMLããã¥ãŒãŸãã¯ããŒã·ã£ã«ã«é¢é£ä»ããŸãã ãã ããBackboneã®ãã¥ãŒã¯ã³ãŒãã§ãããHTMLãã©ã°ã¡ã³ããå¶åŸ¡ããç¹å¥ãªJavaScriptã¯ã©ã¹ã§ãã éåžžãBackboneãã¥ãŒã«ã¯ãéåžžãã¥ãŒãªããžã§ã¯ãã®å€éšã«ãããã³ãã¬ãŒããžã®åç §ãé€ããããŒã¯ã¢ããã¯ã»ãšãã©ãããŸããã
ã¢ãã«
ã¢ãã«ã¯ãã¯ã©ã€ã¢ã³ãåŽã®ããŸããŸãªããããããžãã¹ãªããžã§ã¯ãããã¡ã€ã³ãªããžã§ã¯ãããŸãã¯ãšã³ãã£ãã£ã§ãã Backboneã®èè ã§ããJeremy Ashkenasã®å®çŸ©ã«ããã°ããã¢ãã«ã¯JavaScriptã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ã§ãããã€ã³ã¿ã©ã¯ãã£ãããŒã¿ãšããããã«ããŒããããžãã¯ã®éèŠãªéšåã®äž¡æ¹ãå«ãŸããŠããŸãã å€æãæ€èšŒãèšç®ãããããããã£ãã¢ã¯ã»ã¹å¶åŸ¡ãã Ashkenasã¯ãŸãããããã®ãšã³ãã£ãã£ãšActive Recordã®ãµãŒããŒã«å«ãŸããã¢ãã«ãšã®éã§æ éã«æ³šæããŸãã ãããããããã®ãšã³ãã£ãã£ã¯ã¯ã©ã€ã¢ã³ãäžã«ããããçãã³ã¬ã¯ã·ã§ã³ã§ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæäœãããšãã«åœ¹ç«ã€è¿œå ã®ããããã£ïŒããšãã°ãã«ãŠã³ãïŒcountïŒïŒãææããŠããŸãã
ååãšããŠãMV *ã¯ã©ã€ã¢ã³ããã¬ãŒã ã¯ãŒã¯ã®ã¢ãã«ã®æŠå¿µã¯æ¬¡ã®ãšããã§ããã¢ããªã±ãŒã·ã§ã³ã«é¢é£ããããŒã¿ãé 眮ãããäžå€®ããŒããšããã®ããŒã¿ã§ã«ãã»ã«åã§ãããã¹ãŠã®çš®é¡ã®åäœãäœæããŸãã ãã®ãããªã¢ãã«ã¯ããµãŒããŒMVCãšjQueryã䜿çšããã¢ãŒããã¯ãã£ã«åºã¥ããŠäœæã§ããã¢ãã«ã«é¢é£ããããŒã¿ã¯éåžžDOMã«ä¿åãããŸãã ãã®ãããªã¢ãã«ãäœæããç®çã¯ããã®ããŒã¿ãšç¶æ ãDOMã®å€éšã«åãåºããåå©çšããããå ±éã®å Žæã«é 眮ããããšã§ãã
ããã¯ããŒã³ã®äŸ
ããŒã¿ãã€ã³ãã£ã³ã°ãæ€èšãããåã®äŸã®1ã€ã§ãã¢ãã«ã«ç²ŸéããŸããã ååãšããŠãã¢ãã«ã«ã¯ããŒã¿ãå«ãŸããŠãããDOMã®å€éšã«ä¿åãããŸãããŸãããå€æŽããªã©ã®ã€ãã³ããçæããããã«å¿ããŠå€æ°ã®ãã¥ãŒãåå¿ããå¿ èŠã«å¿ããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ããŸãã ãã®ãããçå®ã®ãœãŒã¹ããããŸãããããã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãããŸããã
var MessageView = Backbone.View.extendïŒ{
ãã³ãã¬ãŒãïŒ_.templateïŒ$ïŒ 'ïŒmessage-template'ïŒãhtmlïŒïŒïŒã
ã€ãã³ãïŒ{
ãã¯ãªãã¯#buttonãïŒãupdateModelã
}ã
updateModelïŒfunctionïŒeventïŒ{
this.model.set({ name: $("#name").val() }); $("#name").html(''); }, initialize: function () { _.bindAll(this, 'render'); this.listenTo(this.model, "change", this.render); }, render: function () { this.$('#message').html(this.template(this.model.toJSON())); return this; } }); var NameView = Backbone.View.extend({ template: _.template($('#name-template').html()), initialize: function () { _.bindAll(this, 'render'); this.listenTo(this.model, "change", this.render); }, render: function () { this.$el.html(this.template(this.model.toJSON())); return this; } }); var Person = Backbone.Model.extend({ defaults: { name: '' } }); var person = new Person(); var messageView = new MessageView({ el: $('#message-container'), model: person }); var nameView = new NameView({ el: $('#name-container'), model: person });
æ°ãããã³ãã¬ãŒããšããã³ãã¬ãŒããšåãPersonã¢ãã«ãªããžã§ã¯ãã«é¢é£ä»ãããããã¥ãŒãè¿œå ããŠãäžèšã®ããŒã¿ãã€ã³ãã£ã³ã°ã®äŸãå°ãå€æŽããŸããã ã³ãŒããè€éã«ããªãããã«äžèšã®Personã¢ãã«ãåçã«å®£èšããŸããããä»ã§ã¯Backbone.Model.extendïŒïŒã¡ãœãããžã®åŒã³åºããè¿œå ããŠãåå©çšå¯èœãªã¢ãã«ã®ãããã¿ã€ããäœæããæ¹æ³ã瀺ããŠããŸã-å€å žçãªèšèªã®ã¯ã©ã¹ã®ããã«ã
泚ïŒäž¡æ¹ã®ãã¥ãŒã¯åãPersonã¢ãã«ãªããžã§ã¯ãïŒå€æŽã€ãã³ãïŒããªãã¹ã³ããæŽæ°ãããŸãã ããŒã¿ãœãŒã¹ã1ã€ãããªãå Žåãç¹å®ã®DOMèŠçŽ ãžã®å€æ°ã®åŒã³åºããç¬èªã®é©åãªè¡šçŸã§ã«ãã»ã«åã§ããã¢ãã«ã¯ããããã¹ãŠãåŠçã§ããŸãã
äžèšã®äŸã§å€æŽã€ãã³ããããªã¬ãŒãããããã«ãã¢ã¯ã»ã¹æ¹æ³ïŒã€ã³ã¹ããŒã©ãŒãšåä¿¡è ïŒãã©ã®ããã«äœ¿çšããããã«æ³šæããŠãã ãã...ãã®åæã¯ãã°ãã°å¿ããããŸãã
AngularJSã®äŸ
ã¢ããªã±ãŒã·ã§ã³ã®ãç¶æ ãã«é¢ããçã®æ å ±ãæ ŒçŽããåäžã¢ãã«ã®ã¢ã€ãã¢ã¯AngularJSã«ååšããŸãããAngularJSã§ã¯ã¢ãã«ãšããŠPOJOãªããžã§ã¯ãã䜿çšã§ãããå éšãã§$ã¹ã³ãŒããªããžã§ã¯ãã«ä»å ããããã¥ãŒã«å®£èšçã«ä»å ãããããããã£ã«ãªãã¶ãŒããŒãè¿œå ããŸããng-modelããã£ã¬ã¯ãã£ãã䜿çšããŸãã 次ã«ããããã®ãªãã¶ãŒããŒã¯åãã¢ãã«ã«æ¥ç¶ãããŠããä»ã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ãã«èªåçã«éç¥ãããããã®DOMèŠçŽ ã¯æŽæ°æ¹æ³ããèªèãããŸãã äžè¬çã«ãããã§ã¯å€ãã®ãããžãã¯ããè¡ãããŠããŸãããAngularJSéçºããŒã ã¯ããã¯ã€ãããžãã¯ãã§ãããšäž»åŒµããŠããŸãã
次ã«ãããŒã¿ãã€ã³ãã£ã³ã°ã䜿çšããAngularJSã®æŽæ°äŸã瀺ããŸãã ããã¯ããã¥ãŒã®ãã©ã°ã¡ã³ããã©ã®ããã«æŽæ°ããããã瀺ããŠããŸãã
<h1>Simple Data Binding with AngularJS</h1> <br /> <div ng-app> Name: <input type="text" ng-model="person.name" /> <br /><br /> Welcome to AngularJS {{person.name}} <br/> Person: {{person.name}} </div>
AngularJS person , ng-model. , JavaScript.
, : , Backbone; , , AngularJS .
AngularJS
AngularJS . -, AJAX , $.ajax jQuery, $http. , RESTful-, AngularJS $resource, RESTful- .
$http
app.factory('myService', function($http) { return { getFooOldSchool: function(callback) { $http.get('foo.json').success(callback); } } }); app.controller('MainCtrl', function($scope, myService) { myService.getFooOldSchool(function(data) { $scope.foo = data; }); }); $resource var Todo = $resource('/api/1/todo/:id'); // todo var todo1 = new Todo(); todo1.foo = 'bar'; todo1.something = 123; todo1.$save(); // todo var todo2 = Todo.get({id: 123}); todo2.foo += '!'; todo2.$save(); // todo Todo.$delete({id: 123});
Backbone
Backbone , RESTful API, Backbone.sync(). , (URL), save.
var UserModel = Backbone.Model.extend({
urlRoot: '/user',
defaults: {
name: '',
email: ''
}
}); var user = new Usermodel(); // : `id` var userDetails = { name: 'Craig', email: 'craigmc@funnyant.com' }; // `id`, // POST /user {name:'Craig', email: 'craigmc@funnyant.com'} // , `id` user.save(userDetails, { success: function (user) { alert(user.toJSON()); } })
Ember
Ember Ember Data, , / . , ORM ActiveRecord, JavaScript . Ember Core v1.0, , Ember $.ajax jQuery, AngularJS $http.
MV*- JavaScript, , . , , , . , â , , .