AngularJS 1.x-CodeSchoolからのコヌス翻蚳

この出版物は、この文脈で私にふさわしいず思われる小さな远加を加えた、元のCoodSchoolコヌスの翻蚳です。 この出版物は、Angularに粟通し始めたばかりの人を察象ずしおいたす。



はじめに



AngularJSは、動的に曎新されるコンテンツで1ペヌゞのWebアプリケヌションを䜜成するこずを䞻な目的ずした人気のあるJavaScriptラむブラリです。 このラむブラリは、スロバキアのプログラマヌMishka Heveryによっお䜜成されたした。MishkaHeveryは、Googleで働いおおり、䞊叞からJavaScriptを孊ぶタスクを受け取りたした。 圌は、蚀語を孊ぶ最良の方法は、それに基づいお独自のフレヌムワヌクを䜜成するこずだず刀断したした。 Angular「Angula」のように聞こえ、文字通り「Angular」ず蚳されるは、 MVC M-モデルデヌタ、V-ビュヌビュヌ、C-コントロヌラヌコントロヌラヌ、制埡レむダヌアプリケヌションのロゞックを提䟛したす。



さたざたな゜ヌスがコントロヌラヌの目的を説明したす。぀たり、コントロヌラヌはナヌザヌのアクションにのみ応答しおモデルを倉曎し、これらの倉曎はナヌザヌの関䞎なしにむンタヌフェヌスに衚瀺されたす。 たたは、コントロヌラヌがモデルに倉曎を加えるだけでなく、必芁に応じお埌続の凊理ずずもにモデルから倉曎を受け取るこずもできたす。 角床は2番目の抂念を順守したす。



Angularは倖郚ラむブラリから独立しおおり、玔粋なJavaScriptで蚘述されおいたすこれは倚くの堎合、プラスず呌ばれたす。 同時に、原則ずしお、Bootstrap CSSず組み合わせお䜿甚​​するこずをお勧めしたす。 たた、Angularは、たずえば芖芚効果のためにjQueryずの共有を制限したせん。 原則ずしお、プレれンテヌションデザむンを目的ずした他のJSラむブラリFacebookチヌムのReactなどは、Angularず䞀緒に䜿甚できたす。



1.フレヌムワヌクの䞻芁な゚ンティティであるモゞュヌル、コントロヌラヌ、ディレクティブ、匏に粟通したす。



Angularの基本構造はモゞュヌルです。 本質的には、盞互接続された機胜のコンテナです。 したがっお、Angularでのアプリケヌションの䜜成は、アプリケヌションの名前を瀺す基本モゞュヌルの䜜成から始たりたす。 たず、次のコヌドを含むapp.jsファむルを䜜成したす。



var app = angular.module('AppName', [ ]);
      
      





AppNameは、アプリケヌションの名前です。 もちろん、それはあなたの奜みに合わせお倉えるこずができたす。 角括匧[]には、モゞュヌルの操䜜に必芁な他のモゞュヌルぞの䟝存関係が瀺されおいたす。 存圚しない堎合は、単に空の配列を瀺したす。 これに぀いおは埌で詳しく説明したす。



コントロヌラヌ[コントロヌラヌ]

さらにモゞュヌルで、コントロヌラヌを定矩したす。 圌は䞀人ですが、倚くの可胜性がありたす。 それぞれ異なる名前で呌び出したす。



 app.controller('StoreController', function(){ this.data = {name: 'Gem', //     price : 3.49} //   });
      
      





ここで、HTMLコヌド内のいく぀かの重芁なステップモゞュヌルをデザむンに接続したす。 これを行うには、index.htmlファむルを䜜成したす。このファむルでは、遞択した<html ng-app = "AppName">ずいう名前のモゞュヌルを䜿甚しおいるこずを最初に宣蚀したす。

Angularは、このHTML内で䜿甚するモゞュヌルを認識したす。 たた、ラむブラリ自䜓ずファむルをアプリケヌションに接続したす。



 <script type="text/javascript" src="angular.min.js"></script> <script type="text/javascript" src="app.js"></script>
      
      







匏[匏]

HTML内では、倉数は䞭括匧{{}}で瀺されたす。 この倉数は、最初にコントロヌラヌで定矩する必芁がありたす。 たた、{{}}内では、倉数だけでなく匏も指定できたす。 䟋{{'Price' + store.data.price + '$'}}。



ブラりザはJSが定矩する前に画像をロヌドしようずするため、IMGタグのsrc属性内では匏を䜿甚できないこずに泚意しおください。 したがっお、Angularは特別なng-srcディレクティブを䜿甚したす。



 <img ng-src="{{expression}}"/>
      
      







指什

ディレクティブは、HTMLタグ内で盎接䜿甚される特別な属性であり、このディレクティブに察しお定矩されたロゞックに埓っお、Angularによっお凊理されたす。 たずえば、デヌタを衚瀺する必芁があるブロック内で、このデヌタを提䟛するコントロヌラヌの名前この堎合はStoreControllerを指定したす。 これは、組み蟌みのng-controllerディレクティブを䜿甚しお行われたす。



 <div ng-controller="StoreController as store"> {{store.data.price}} //  3.49 <\div>
      
      





他の䞀般的に䜿甚される組み蟌みディレクティブは次のずおりです。

ng-show-倀がFalseの堎合、HTML芁玠を非衚瀺にしたすdisplaynoneを䜿甚。 モデルの状態に応じおむンタヌフェむス芁玠を削陀する必芁がある堎合に圹立ちたす。 たずえば、販売されおいる補品の堎合、[賌入]ボタンを自動的に削陀したす。

ng-hideはng-showの逆です。 ぀たり 倀がTrueの堎合、芁玠を非衚瀺にしたす。

ng-repeat -foreach関数ず意味が䌌おいたす。 ぀たり HTMLブロックに含たれるタグを繰り返したす。 たずえば、別の補品をコントロヌラヌに远加したす。



 app.controller('StoreController', function(){ this.data = [{name: 'Gem', price : 3.49}, {name: 'Emerald', price : 17.99}] });
      
      





ここで、䞡方の補品の䟡栌を衚瀺するために、ng-repeatを䜿甚したす。



 <div ng-controller="StoreController as store"> <div ng-repeat="product in store.data"> <li>{{product.name}}: ${{product.price}} <\div> <\div>
      
      





出力では次のようになりたす。

宝石3.49ドル

゚メラルド17.99ドル



Angularには、さたざたなルヌチンタスクを解決するために蚭蚈された他の倚くの組み蟌みディレクティブもありたす。



2.フィルタヌ、ディレクティブ、クリヌンコヌド



フィルタヌは匏およびディレクティブで䜿甚され、デヌタ圢匏を倉曎するように蚭蚈されおいたす。



{{デヌタ| フィルタヌ[オプション1] [オプション2]}}



 <li>{{product.name}}: {{product.price | currency:"$":0}} // Emerald: $17 ============= = ======== === = | | | | +-     () | | | +-   () | | +-  () | +- pipe (""          ) +- 
      
      







フィルタヌの䟋



 <b>date</b> {{'1388123412323' | date:'MM/dd/yyyy @ h:mma'}} // 12/27/2013 @ 12:50AM
      
      







 <b>uppercase</b> {{'octagon gem' | uppercase}} // OCTAGON GEM
      
      







 <b>limitTo</b> ᅩ{{'My Description' | limitTo:8}} // My Descr ᅩ<li ng-repeat="product in store.products | limitTo:3"> //    
      
      







 <b>orderBy</b> <li ng-repeat="product in store.products | orderBy:'-price'"> //   
      
      







Angularの組み蟌みフィルタヌの完党なリスト 。



ここで、コヌドのクリヌンさに぀いお少し説明したす。 これを行うには、次の䟋を䜿甚したす。



 <section ng-init="tab = 1"> <ul class="nav nav-pills"> <li ng-class="{active:tab === 1}"> <a href ng-click="tab = 1">Description</a> </li> <li ng-class="{active:tab === 2}"> <a href ng-click="tab = 2">Specifications</a> </li> <li ng-class="{active:tab === 3}"> <a href ng-click="tab = 3">Reviews</a> </li> </ul> <div class="panel" ng-show="tab === 1"> <h4>Description </h4> <p>{{product.description}}</p> </div> </section>
      
      







ご芧のずおり、ロゞックはHTMLに盎接含たれおいたすが、これはもちろん正しくないため、コントロヌラヌレベルに移動する必芁がありたす。 これを行うには、コントロヌラヌ関数に次のコヌドを远加したす。



 app.controller("PanelController", function(){ //  this.tab = 1; //    this.selectTab = function(setTab) { this.tab = setTab; }; //      this.isSelected = function(checkTab){ return this.tab === checkTab; }; });
      
      





ロゞックは珟圚コントロヌラヌ内にあり、それに応じおHTMLを倉曎するだけです。



 <section ng-controller="PanelController as panel"> <ul class="nav nav-pills"> <li ng-class="{ active: panel.isSelected(1) }"> <a href ng-click="panel.selectTab(1)">Description</a> </li> <li ng-class="{ active: panel.isSelected(2) }"> <a href ng-click="panel.selectTab(2)">Specifications</a> </li> <li ng-class="{ active: panel.isSelected(3) }"> <a href ng-click="panel.selectTab(3)">Reviews</a> </li> </ul> <div class="panel" ng-show="panel.isSelected(1)"> <h4>Description </h4> <p>{{product.description}}</p> </div> </section>
      
      









3.フォヌムの䜜成䟋のモデルずバリデヌタヌ



Angularの䞻な機胜の1぀は、いわゆる双方向デヌタバむンディングです。これは、フォヌムのペヌゞのデヌタを倉曎するずモデルデヌタを栌玍するオブゞェクトのデヌタが自動的に倉曎され、モデルのデヌタを倉曎するず関連するデヌタも自動的に曎新されるこずを意味したすペヌゞの情報。 䞀芋混乱しおいるように芋えるので、䟋を䜿っお説明する䟡倀がありたす。



 <form name="reviewForm"> <blockquote> <b>Stars: {{review.stars}}</b> {{review.body}} <cite>by: {{review.author}}</cite> </blockquote> <select ng-model="review.stars"> <option value="1">1 star</option> <option value="2">2 stars</option> . . . </select> <textarea ng-model="review.body"></textarea> <label>by:</label> <input ng-model="review.author" type="email" /> <input type="submit" value="Submit" /> </form>
      
      







たずえば、<select ng-model = "review.stars">セレクタヌのデヌタを倉曎するず、匏{{review.stars}}を䜿甚しおペヌゞに自動的に衚瀺されたす



したがっお、ビュヌレベルビュヌからのデヌタはデヌタストレヌゞレむダヌモデルに転送され、その逆も同様です。



たた、 ng-modelディレクティブを䜿甚しおモデルデヌタを送信する堎合、デヌタが怜蚌され、怜蚌の結果に基づいお特別なクラスが蚭定され、その他倚くの有甚なむベントが発生するこずに泚意しおください。



次に、フォヌムをコントロヌラに接続し、その凊理を保蚌したす。 たず、 addReviewメ゜ッドを含むコントロヌラヌ自䜓を䜜成したす。このメ゜ッドは、フォヌムが送信されたずきに呌び出す必芁がありたす。



 app.controller("ReviewController", function(){ this.review = {}; //     this.addReview = function(product) { product.reviews.push(this.review); //        this.review = {}; //   }; });
      
      







次に、フォヌムに必芁な調敎を行いたす



 <form name="reviewForm" ng-controller="ReviewController as reviewCtrl" ng-submit="reviewCtrl.addReview(product)"> <blockquote> <b>Stars: {{reviewCtrl.review.stars}}</b> {{reviewCtrl.review.body}} <cite>by: {{reviewCtrl.review.author}}</cite> </blockquote> <select ng-model="reviewCtrl.review.stars"> <option value="1">1 star</option> <option value="2">2 stars</option> . . . </select> <textarea ng-model="reviewCtrl.review.body"></textarea> <label>by:</label> <input ng-model="reviewCtrl.review.author" type="email" /> <input type="submit" value="Submit" /> </form>
      
      







怜蚌を远加したす。 たず、 必須の匕数を䜿甚しおフォヌムフィヌルドを必須ずしおマヌクし、有効なフォヌムのデヌタのみが保存されるずいう条件も远加したす。 これを行うには、 novalidateオプションをFormタグに远加するず、デフォルトのHTML怜蚌が無効になり、 reviewForm。$ Valid条件が远加されたす。これにより、 addReviewメ゜ッドは有効なフォヌムでのみ呌び出されたす。



 <form name="reviewForm" ng-controller="ReviewController as reviewCtrl" novalidate ng-submit="reviewForm.$valid && reviewCtrl.addReview(product)"> <blockquote> <b>Stars: {{reviewCtrl.review.stars}}</b> {{reviewCtrl.review.body}} <cite>by: {{reviewCtrl.review.author}}</cite> </blockquote> <select ng-model="reviewCtrl.review.stars" required> <option value="1">1 star</option> <option value="2">2 stars</option> . . . </select> <textarea ng-model="reviewCtrl.review.body" required></textarea> <label>by:</label> <input ng-model="reviewCtrl.review.author" type="email" required/> <div> reviewForm is {{reviewForm.$valid}} </div> <input type="submit" value="Submit" /> </form>
      
      







type属性を䜿甚しお指定された特定のタむプのすべおのフィヌルドは、正しい入力のためにチェックされたす。 この堎合、Angularは怜蚌状態に応じお特定のCSSクラスをフィヌルドに远加したす。



したがっお、たずえば、電子メヌルタむプの堎合、確立されたクラスは次のように倉曎されたす。



.ng-pristine .ng-invalid //初期状態クリヌン、無効

.ng-dirty .ng-invalid //無効なメヌル入力枈み、無効

.ng-dirty .ng-valid //有効な電子メヌル蚘入枈み、有効



したがっお、これらのクラスに適したCSSルヌルを蚭定できたす。 そのため、たずえば、誀っお入力されたフィヌルドの呚りに赀いフレヌムがあり、正しく入力されたフィヌルドの呚りに緑色のフレヌムがありたす。



 .ng-dirty.ng-invalid { border-color: #FA787E; //   } .ng-dirty.ng-valid { border-color: #78FA89; //   }
      
      







珟圚、入力フィヌルドでは次のバリデヌタヌがサポヌトされおいたす。





4.独自のディレクティブを䜜成する



Angularの優れた機胜の1぀は、カスタムディレクティブを䜜成できるこずです。 蚀い換えれば、独自のロゞックを持぀独自のHTMLタグを䜜成し、HTML党䜓を眮き換えるこずができたす。 たずえば、挿入しお<editor>タグを䜜成し、ペヌゞにテキスト゚ディタヌを取埗できたす。



これにより、アプリケヌションの構造を完党に䌝える衚珟力豊かなコヌドを䜜成できたす。 そしおもちろん、これによりコヌドの再利甚が倧幅に改善されたす。



原則ずしお、HTMLコヌドのフラグメントの再利甚に関しお、Angularは自由にng-includeディレクティブを䜿甚したす。これにより、コヌドの䞀郚を別のファむルに取り出すこずができたす。 次のようになりたす。



 <h3 ng-include="'product-title.html'"></h3>
      
      







名前を囲​​む䞀重匕甚笊に泚意しおください。 それらは、ファむル名を含む倉数ではなく、名前を持぀文字列であるこずをAngularに䌝えたす。



したがっお、product-title.htmlファむルには、AngularがH3タグのコンテンツずしお挿入するコヌドが含たれたす。 䟋



 {{product.name}} <em class="pull-right">${{product.price}}</em>
      
      







ご芧のずおり、この方法で挿入されたコヌドには、そのようなフラグメントを䞀般的なコヌドに挿入した埌に凊理される匏が含たれおいる堎合がありたす。



ただし、独自のディレクティブの䜜成に戻りたす。 これは次のように行われたす。



 app.directive('productTitle', function(){ return { restrict: 'E', // E -      Element templateUrl: 'product-title.html' }; });
      
      





これで、これをHTMLタグずしお䜿甚できたす。 HTMLのproductTitleディレクティブの名前はproduct-titleに倉換されるこずに泚意しおください。



 <product-title></product-title>
      
      





タグをカスタマむズする別の方法は、独自の属性を䜜成するこずです。 この堎合、ディレクティブを䜜成するずきに、E芁玠の代わりに、 restrictプロパティにA属性を指定する必芁がありたす。 その埌、HTMLタグは次のようになりたす。



 <h3 product-title></h3>
      
      







りィゞェットや、独自のロゞックを含む他の完党に独立した芁玠の挿入には「restrictE」を䜿甚し、mixinには「restrictA」を䜿甚するこずをお勧めしたす。



りィゞェットに関しおは、必芁なすべおのロゞックを含むコントロヌラヌなしでは実行できたせん。 Angularでは、いく぀かの方法でこれを実装できたす。 たず、 ng-controller属性を远加するだけです



<product-panels ng-controller = "パネルずしおのPanelController">



ただし、ディレクティブを䜜成する関数内でコントロヌラヌプロパティを䜿甚する方が適切です。



 app.directive('productPanels', function(){ return { restrict: 'E', templateUrl: 'product-panels.html', controller: function(){ ... //  }, controllerAs: 'panels' //   }; });
      
      







5.䟝存関係ずサヌビス



䟝存関係は、䜜成する新しいモゞュヌルの機胜を確保するために必芁なモゞュヌルです。 たた、異なるモゞュヌル間でロゞックの独立した郚分を分散させるこずにより、アプリケヌションの構造を改善する方法ず考えるこずもできたす。 次の䟋を考えおみたしょう。



 //  app.js (function(){ var app = angular.module('store', []); app.controller('StoreController', function(){ . . . }); app.directive('productTitle', function(){ . . . }); app.directive('productGallery', function(){ . . . }); app.directive('productPanels', function(){ . . . }); })();
      
      







必芁な柔軟性に応じお、独立したモゞュヌルでディレクティブを䜜成したり、各モゞュヌルで独自のモゞュヌルを䜜成したりするこずは論理的です。



ただし、この堎合、アプリケヌションの構造を過床に耇雑にしないために、共通のモゞュヌルを削陀したす。



 //  products.js (function(){ var app = angular.module('store-products', []); app.directive('productTitle', function(){ . . . }); app.directive('productGallery', function(){ . . . }); app.directive('productPanels', function(){ . . . }); })();
      
      





次に、store-productsモゞュヌルをstoreモゞュヌルの䟝存関係ずしお指定したす。



 //  app.js (function(){ var app = angular.module('store', [store-products]); app.controller('StoreController', function(){ . . . }); })();
      
      





最埌のステップは、新しいファむルを忘れずに含めるこずです。



 //  index.html <!DOCTYPE html> <html ng-app="store"> <head> . . . </head> <body ng-controller="StoreController as store"> . . . <script src="angular.js"></script> <script src="app.js"></script> <script src="products.js"></script> </body> </html>
      
      







その結果、機胜に基づいおモゞュヌルを分割したした。



app.js-ng-appディレクティブを䜿甚した最䞊䜍モゞュヌルプラグむンが含たれおいたす。

products.js-補品および補品のみのすべおの機胜が含たれおいたす。



たた、䟝存関係ずしお、Angularに組み蟌たれおいるさたざたな暙準機胜を提䟛するサヌビスを指定できたす。 組み蟌みサヌビスの名前は$で始たりたす。



最も人気のあるサヌビスの䟋は次のずおりです。



$ http -XMLHttpRequestを介したサヌバヌずの通信。

$ log-ブラりザコン゜ヌルにメッセヌゞを蚘録したす。

$ filter-配列内のデヌタをフィルタヌしたす。

... 完党なリスト 。



コントロヌラヌに䟝存性泚入を含める䟋。



 app.controller('SomeController', [ '$http', '$log', function($http, $log){ var store = this; store.products = []; $http({ method: 'GET', url: '/products.json' }).success(function(data, status, headers, config) { $log.info(status); store.products = data; }) } ]);
      
      






All Articles