AngularJS の概要 AngularJS は JavaScript フレームワークです。 タグを介して HTML ページに追加できます。 <br> </p> <p>AngularJS はディレクティブを通じて HTML を拡張し、式を通じてデータを HTML にバインドします。 <br> </p> <p><span style="color: #0000ff"><strong>AngularJS とは何ですか? </strong></span></p> <p>AngularJS を使用すると、最新のシングル ページ アプリケーション (SPA: シングル ページ アプリケーション) の開発が容易になります。 <br> </p> <p>AngularJS はアプリケーション データを HTML 要素にバインドします。 <br> </p> <p>AngularJS は HTML 要素を複製して繰り返すことができます。 <br> </p> <p>AngularJS は HTML 要素を非表示にしたり表示したりできます。 <br> </p> <p>AngularJS は HTML 要素の「後ろ」にコードを追加できます。 <br> </p> <p>AngularJS は入力検証をサポートしています。 </p> <p>通常、JSON は AngularJS にデータを保存するためのモデルとして使用されます。次のようにコントローラーにモデルを記述します: </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.controller('BookController',['$scope',function($scope){ $scope.book = { id:1, name:'', author:'', stores:[ {id:1, name:'', quantity:2}, {id:2, name:'', quantity:2}, ... ] }; }])</pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>このモデルは次のようにビューで使用できます:<br /> </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> <div ng-controller="BookController"> <span ng-bind="book.id"></span> <input type="text" ng-model="book.name"/> <input type="text" ng-model="book.author"/> </div> </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>サーバーからデータを取得する必要がある場合、次のように記述できます: </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.controller('BookController',['$scope', '$http', function($scope, $http){ var bookId = 1; $http.get('api/books'+bookId).success(function(bookData){ $scope.book = bookData; }) $scope.deleteBook = function(){ $http.delete('api/books/' + bookId); } $scope.updateBook = function(){ $http.put('api/books/'+bookId, $scope.book); } $scope.getBookImageUrl = function(width, height){ return 'our/iamge/service' +bookId + '/width/height'; } $scope.isAvailable = function(){ if(!$scope.book.stores || $scope.book.stores.length === 0){ return false; } reutrn $scope.book.stores.some(function(store){ return store.quantity > 0; }) } }]) </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p> はビュー内で次のように使用できます: </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> <div ng-controller="BookController"> <div ng-style="{backgroundImage: 'url('+getBookImageUrl(100,100)+')'}"></div> <span ng-bind="book.id"></span? <input type="text" ng-model="book.name"/> <input type="text" ng-model="book.author"/> is available: <span ng-bind="isAvailable() ? 'Yes' : 'No'"></span> <button ng-click="deleteBook()">Delete</button> <button ng-click="updateBook">Update</button> </div> </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p> 上記では、JSON 形式のモデルは BookController でのみ使用できますが、他のコントローラーではどのように使用できますか? <br /> --工場出荷時の方法による</p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.factory('Book', ['$http', function($http){ function Book(bookData){ if(bookData){ this.setData(bookData); } } Book.prototype = { setData: function(bookData){ angular.extend(this, bookData); }, load: function(id){ var scope = this; $http.get('api/books/' + bookId).success(function(bookData){ scope.setData(bookData); }) }, delete: function(bookId){ $http.delete('api/books/' + bookId); }, update: function(bookId){ $http.put('api/books/' + bookId, this); }, getImageUrl: function(width, height){ return 'our/image/service/' + this.book.id + '/' + width + '/' + height; }, isAvailable: funciton(){ if(!this.book.stores || this.book.stores.length === 0) { return false; } return this.book.stores.some(function(store){ return store.quantity > 0; }) } } return Book; }]) </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>上記では、ブックに似たデータ モデルがファクトリーを通じて作成されており、これをコントローラーに挿入できるようになりました。 <br /> </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.controller('BookController', ['$scope', 'Book', function($scope, Book){ $scope.book = new Book(); $scope.book.load(1); }]) </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p> ビューにも対応する変更が加えられます。 </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> <div ng-controller="BookController"> <div ng-style="{backgroundImage: 'url(' + book.getImageUrl(100, 100) + ')'}"></div> <span ng-bind="book.id"></span> <input type="text" ng-model="book.name"/> <input type="text" ng-model="book.author"/> is abailble: <span ng-bind="book.isAvailabe() ? 'Yes' : 'No'"></span> <button ng-click="book.delete()">Delete</button> <button ng-click="book.update()">Update</button> </div> </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>上記のように、複数のコントローラーが書籍に関する同じデータ モデルを使用できます。複数のコントローラーが書籍に関する同じデータ モデルを処理するとどうなるでしょうか。 </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.factory('booksManager', ['$http', '$q', 'Book', function($http. $q, Book){ var booksManager = { _pool: {}, _retrieveInstance: function(bookId, bookData){ var instance = this._pool[bookId]; if(instance){ instance.setData(bookData); } else { instance = new Book(bookData); this._pool[bookId] = instance; } return instance; }, _seach: function(bookId){ reutrn this_.pool[bookId]; }, _load: function(bookId, deferred){ var scope = this; $http.get('api/books/' + bookId) .success(funciton(bookData){ var book = scope._retrieveInstance(bookData.id, bookData); deferred.resolve(book); }) .error(function(){ deferred.reject(); }) }, getBook: function(bookId){ var deferred = $q.defer(); var book = this._search(bookId); if(book){ deferred.resove(book); } else { this._load(bookId, deferred); } return deferred.promise; }, loadAllBooks: function(){ var deferred = $q.defer(); var scope = this; $http.get('api/books') .success(function(booksArray){ var books = []; booksArray.forEach(function(bookData){ var book = scope.l_retrieveInstance(bookData.id, bookData); books.push(book); }); deferred.resolve(books); }) .error(function(){ deferred.reject(); }); return deferred.promise; }, setBook: function(bookData){ var scope = this; var book = this._search(bookData.id); if(book){ book.setData(bookData); } else { book = scope._retrieveInstance(bookData); } return book; } }; return booksManager; }]) </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>予約サービスでは、load メソッドが削除されます。 </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.factory('Book', ['$http', function($http) { function Book(bookData) { if (bookData) { this.setData(bookData): } // Some other initializations related to book }; Book.prototype = { setData: function(bookData) { angular.extend(this, bookData); }, delete: function() { $http.delete('ourserver/books/' + bookId); }, update: function() { $http.put('ourserver/books/' + bookId, this); }, getImageUrl: function(width, height) { return 'our/image/service/' + this.book.id + '/width/height'; }, isAvailable: function() { if (!this.book.stores || this.book.stores.length === 0) { return false; } return this.book.stores.some(function(store) { return store.quantity > 0; }); } }; return Book; }]); </pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p>複数のコントローラーが同じ BooksManager サービスを使用できるようになりました。 </p> <div class="jb51code"> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;"> app.controller('EditableBookController',['$scope', 'booksManager', function($scope, booksManager){ booksManager.getBook(1).then(function(book){ $scope.book = book; }) }]) .controller('BooksListController',['$scope', 'booksManager', function($scope, booksManager){ booksManager.loadAllBooks().then(function(books){ $scope.books = books; }) }])</pre><div class="contentsignin">ログイン後にコピー</div></div> </div> <p></p>