JavaScriptフレヌムワヌク。 それらを玠早く孊ぶ方法

こんにちは同僚。



今日、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, , . , , , . , – , , .



All Articles