ÎÒÃÇÖªµÀ£¬AngularJS²¢Ã»ÓÐ×Ô´øÁ¢µÈ¿ÉÓõÄÊý¾Ý½¨Ä£·½°¸¡£¶øÊÇÒÔÏ൱³éÏóµÄ·½Ê½£¬ÈÃÎÒÃÇÔÚcontrollerÖÐʹÓÃJSONÊý¾Ý×÷ΪģÐÍ¡£µ«ÊÇËæ×Åʱ¼äµÄÍÆÒÆºÍÏîÄ¿µÄ³É³¤£¬ÎÒÒâʶµ½ÕâÖÖ½¨Ä£µÄ·½Ê½²»ÔÙÄÜÂú×ãÎÒÃÇÏîÄ¿µÄÐèÇó¡£ÔÚÕâÆªÎÄÕÂÖÐÎÒ»á½éÉÜÔÚÎÒµÄAngularJSÓ¦ÓÃÖд¦ÀíÊý¾Ý½¨Ä£µÄ·½Ê½¡£
ΪController¶¨ÒåÄ£ÐÍ
ÈÃÎÒÃÇ´ÓÒ»¸ö¼òµ¥µÄÀý×Ó¿ªÊ¼¡£ÎÒÏëÒªÏÔʾһ¸öÊé±¾(book)µÄÒ³Ãæ¡£ÏÂÃæÊÇ¿ØÖÆÆ÷(Controller)£º
BookController
app.controller('BookController', ['$scope', function($scope) { $scope.book = { id: 1, name: 'Harry Potter', author: 'J. K. Rowling', stores: [ { id: 1, name: 'Barnes & Noble', quantity: 3}, { id: 2, name: 'Waterstones', quantity: 2}, { id: 3, name: 'Book Depository', quantity: 5} ] }; }]); |
Õâ¸ö¿ØÖÆÆ÷´´½¨ÁËÒ»¸öÊé±¾µÄÄ£ÐÍ£¬ÎÒÃÇ¿ÉÒÔÔÚºóÃæµÄÄ£°åÖÐ(templage)ÖÐʹÓÃËü¡£
template for displaying a book
<div ng-controller="BookController"> Id: <span ng-bind="book.id"></span> <br/> Name:<input type="text" ng-model="book.name" /> <br/> Author: <input type="text" ng-model="book.author" /> </div> |
¼ÙÈçÎÒÃÇÐèÒª´Óºǫ́µÄapi»ñÈ¡Êé±¾µÄÊý¾Ý£¬ÎÒÃÇÐèҪʹÓÃ$http:
BookController with $http
app.controller('BookController', ['$scope', '$http', function($scope, $http) { var bookId = 1; $http.get('ourserver/books/' + bookId).success(function(bookData) { $scope.book = bookData; }); }]); |
×¢Òâµ½ÕâÀïµÄbookDataÈÔÈ»ÊÇÒ»¸öJSON¶ÔÏó¡£½ÓÏÂÀ´ÎÒÃÇÏëҪʹÓÃÕâЩÊý¾Ý×öһЩÊÂÇé¡£±ÈÈ磬¸üÐÂÊé±¾ÐÅÏ¢£¬É¾³ýÊé±¾£¬ÉõÖÁÆäËûµÄһЩ²»Éæ¼°µ½ºǫ́µÄ²Ù×÷£¬±ÈÈç¸ù¾ÝÇëÇóµÄͼƬ´óСÉú³ÉÒ»¸öÊ鱾ͼƬµÄurl£¬»òÕßÅжÏÊé±¾ÊÇ·ñÓÐЧ¡£ÕâЩ·½·¨¶¼¿ÉÒÔ±»¶¨ÒåÔÚ¿ØÖÆÆ÷ÖС£
BookController with several book actions
app.controller('BookController', ['$scope', '$http', function($scope, $http) { var bookId = 1; $http.get('ourserver/books/' + bookId).success(function(bookData) { $scope.book = bookData; }); $scope.deleteBook = function() { $http.delete('ourserver/books/' + bookId); }; $scope.updateBook = function() { $http.put('ourserver/books/' + bookId, $scope.book); }; $scope.getBookImageUrl = function(width, height) { return 'our/image/service/' + bookId + '/width/height'; }; $scope.isAvailable = function() { if (!$scope.book.stores || $scope.book.stores.length === 0) { return false; } return $scope.book.stores.some(function(store) { return store.quantity > 0; }); }; }]); |
È»ºóÔÚÎÒÃǵÄÄ£°åÖУº
template for displaying a complete book
<div ng-controller="BookController"> <div ng-style="{ backgroundImage: 'url(' + getBookImageUrl(100, 100) + ')' }"></div> Id: <span ng-bind="book.id"></span> <br/> Name:<input type="text" ng-model="book.name" /> <br/> Author: <input type="text" ng-model="book.author" /> <br/> Is Available: <span ng-bind="isAvailable() ? 'Yes' : 'No' "></span> <br/> <button ng-click="deleteBook()">Delete</button> <br/> <button ng-click="updateBook()">Update</button> </div> |
ÔÚcontrollersÖ®¼ä¹²ÏíModel
Èç¹ûÊé±¾µÄ½á¹¹ºÍ·½·¨Ö»ºÍÒ»¸ö¿ØÖÆÆ÷Óйأ¬ÄÇÎÒÃÇÏÖÔڵŤ×÷ÒѾ¿ÉÒÔÓ¦¸¶¡£µ«ÊÇËæ×ÅÓ¦ÓõÄÔö³¤£¬»áÓÐÆäËûµÄ¿ØÖÆÆ÷Ò²ÐèÒªºÍÊé±¾´ò½»µÀ¡£ÄÇЩ¿ØÖÆÆ÷ºÜ¶àʱºòÒ²ÐèÒª»ñÈ¡Êé±¾£¬¸üÐÂËü£¬É¾³ýËü£¬»òÕß»ñµÃËüµÄͼƬurlÒÔ¼°¿´ËüÊÇ·ñÓÐЧ¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ¿ØÖÆÆ÷Ö®¼ä¹²ÏíÕâЩÊé±¾µÄÐÐΪ¡£ÎÒÃÇÐèҪʹÓÃÒ»¸ö·µ»ØÊé±¾ÐÐΪµÄfactoryÀ´ÊµÏÖÕâ¸öÄ¿µÄ¡£ÔÚ¶¯ÊÖдһ¸öfactory֮ǰ£¬ÎÒÏëÔÚÕâÀïÏÈÌáһϣ¬ÎÒÃÇ´´½¨Ò»¸öfactoryÀ´·µ»Ø´øÓÐÕâЩbook¸¨Öú·½·¨µÄ¶ÔÏ󣬵«ÎÒ¸üÇãÏòÓÚʹÓÃprototypeÀ´¹¹ÔìÒ»¸öBookÀ࣬ÎÒ¾õµÃÕâÊǸüÕýÈ·µÄÑ¡Ôñ£º
Book model service
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); }, load: function(id) { var scope = this; $http.get('ourserver/books/' + bookId).success(function(bookData) { scope.setData(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; }]); |
ÕâÖÖ·½Ê½Ï£¬Êé±¾Ïà¹ØµÄËùÓÐÐÐΪ¶¼±»·â×°ÔÚBook·þÎñÄÚ¡£ÏÖÔÚ£¬ÎÒÃÇÔÚBookControllerÖÐÀ´Ê¹ÓÃÕâ¸öÁÁÑÛµÄBook·þÎñ¡£
BookController that uses Book model
app.controller('BookController', ['$scope', 'Book', function($scope, Book) { $scope.book = new Book(); $scope.book.load(1); }]); |
ÕýÈçÄã¿´µ½µÄ£¬¿ØÖÆÆ÷±äµÃ·Ç³£¼òµ¥¡£Ëü´´½¨Ò»¸öBookʵÀý£¬Ö¸Åɸøscope£¬²¢´Óºǫ́¼ÓÔØ¡£µ±Êé±¾±»¼ÓÔØ³É¹¦Ê±£¬ËüµÄÊôÐԻᱻ¸Ä±ä£¬Ä£°åÒ²Ëæ×ű»¸üС£¼ÇסÆäËûµÄ¿ØÖÆÆ÷ÏëҪʹÓÃÊé±¾¹¦ÄÜ£¬Ö»Òª¼òµ¥µØ×¢ÈëBook·þÎñ¼´¿É¡£´ËÍ⣬ÎÒÃÇ»¹Òª¸Ä±ätemplateʹÓÃbookµÄ·½·¨¡£
template that uses book instance
<div ng-controller="BookController"> <div ng-style="{ backgroundImage: 'url(' + book.getImageUrl(100, 100) + ')' }"></div> Id: <span ng-bind="book.id"></span> <br/> Name:<input type="text" ng-model="book.name" /> <br/> Author: <input type="text" ng-model="book.author" /> <br/> Is Available: <span ng-bind="book.isAvailable() ? 'Yes' : 'No' "></span> <br/> <button ng-click="book.delete()">Delete</button> <br/> <button ng-click="book.update()">Update</button> </div> |
µ½ÕâÀÎÒÃÇÖªµÀÁËÈçºÎ½¨Ä£Ò»¸öÊý¾Ý£¬°ÑËûµÄ·½·¨·â×°µ½Ò»¸öÀàÖУ¬²¢ÇÒÔÚ¶à¸ö¿ØÖÆÆ÷Öй²ÏíËü£¬¶ø²»ÐèÒªÐ´ÖØ¸´´úÂë¡£
ÔÚ¶à¸ö¿ØÖÆÆ÷ÖÐʹÓÃÏàͬµÄÊ鱾ģÐÍ
ÎÒÃǶ¨ÒåÁËÒ»¸öÊ鱾ģÐÍ£¬²¢ÇÒÔÚ¶à¸ö¿ØÖÆÆ÷ÖÐʹÓÃÁËËü¡£ÔÚʹÓÃÁËÕâÖÖ½¨Ä£¼Ü¹¹Ö®ºóÄã»á×¢Òâµ½ÓÐÒ»¸öÑÏÖØµÄÎÊÌâ¡£µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃǼÙÉè¶à¸ö¿ØÖÆÆ÷¶ÔÊé±¾½øÐвÙ×÷£¬µ«Èç¹ûÓÐÁ½¸ö¿ØÖÆÆ÷ͬʱ´¦Àíͬһ±¾Êé»áÊÇʲôÇé¿öÄØ£¿
¼ÙÉèÎÒÃÇÒ³ÃæµÄÒ»¿éÇøÓòÎÒÃÇËùÓÐÊé±¾µÄÃû³Æ£¬ÁíÒ»¿éÇøÓò¿ÉÒÔ¸üÐÂijһ±¾Êé¡£¶ÔÓ¦ÕâÁ½¿éÇøÓò£¬ÎÒÃÇÓÐÁ½¸ö²»Í¬µÄ¿ØÖÆÆ÷¡£µÚÒ»¸ö¼ÓÔØÊé±¾ÁÐ±í£¬µÚ¶þ¸ö¼ÓÔØÌØ¶¨µÄÒ»±¾Êé¡£ÎÒÃǵÄÓû§ÔÚµÚ¶þ¿éÇøÓòÖÐÐÞ¸ÄÁËÊé±¾µÄÃû³Æ²¢ÇÒµã»÷¡°¸üС±°´Å¥¡£¸üвÙ×÷³É¹¦ºó£¬Êé±¾µÄÃû³Æ»á±»¸Ä±ä¡£µ«ÊÇÔÚÊé±¾ÁбíÖУ¬Õâ¸öÓû§Ê¼ÖÕ¿´µ½µÄÊÇÐÞ¸Ä֮ǰµÄÃû³Æ£¡ÕæÊµµÄÇé¿öÊÇÎÒÃǶÔͬһ±¾Êé´´½¨ÁËÁ½¸ö²»Í¬µÄÊ鱾ʵÀý¡ª¡ªÒ»¸öÔÚÊé±¾ÁбíÖÐʹÓ㬶øÁíÒ»¸öÔÚÐÞ¸ÄÊ鱾ʱʹÓᣵ±Óû§ÐÞ¸ÄÊé±¾Ãû³ÆµÄʱºò£¬Ëüʵ¼ÊÉÏÖ»ÐÞ¸ÄÁ˺óÒ»¸öʵÀýÖеÄÊôÐÔ¡£È»¶øÊé±¾ÁбíÖеÄÊ鱾ʵÀý²¢Î´µÃµ½¸Ä±ä¡£
½â¾öÕâ¸öÎÊÌâµÄ°ì·¨ÊÇÔÚËùÓеĿØÖÆÆ÷ÖÐʹÓÃÏàͬµÄÊ鱾ʵÀý¡£ÔÚÕâÖÖ·½Ê½Ï£¬Êé±¾ÁбíºÍÊé±¾Ð޸ĵÄÒ³ÃæºÍ¿ØÖÆÆ÷¶¼³ÖÓÐÏàͬµÄÊ鱾ʵÀý£¬Ò»µ©Õâ¸öʵÀý·¢Éú±ä»¯£¬¾Í»á±»Á¢¿Ì·´Ó³µ½ËùÓеÄÊÓͼÖС£ÄÇô°´ÕâÖÖ·½Ê½Ðж¯ÆðÀ´£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öbooksManager·þÎñ£¨ÎÒÃÇûÓдóд¿ªÍ·µÄb×Öĸ£¬ÊÇÒòΪÕâÊÇÒ»¸ö¶ÔÏó¶ø²»ÊÇÒ»¸öÀࣩÀ´¹ÜÀíËùÓеÄÊ鱾ʵÀý³Ø£¬²¢ÇÒ¸»×ã·µ»ØÕâЩÊ鱾ʵÀý¡£Èç¹û±»ÇëÇóµÄÊ鱾ʵÀý²»ÔÚʵÀý³ØÖУ¬Õâ¸ö·þÎñ»á´´½¨Ëü¡£Èç¹ûÒѾÔÚ³ØÖУ¬ÄÇô¾ÍÖ±½Ó·µ»ØËü¡£ÇëÀμǣ¬ËùÓеļÓÔØÊé±¾µÄ·½·¨×îÖÕ¶¼»á±»¶¨ÒåÔÚbooksManager·þÎñÖУ¬ÒòΪËüÊÇΨһµÄÌṩÊ鱾ʵÀýµÄ×é¼þ¡£
booksManager service
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; }, _search: function(bookId) { return this._pool[bookId]; }, _load: function(bookId, deferred) { var scope = this; $http.get('ourserver/books/' + bookId) .success(function(bookData) { var book = scope._retrieveInstance(bookData.id, bookData); deferred.resolve(book); }) .error(function() { deferred.reject(); }); }, /* Public Methods */ /* Use this function in order to get a book instance by it's id */ getBook: function(bookId) { var deferred = $q.defer(); var book = this._search(bookId); if (book) { deferred.resolve(book); } else { this._load(bookId, deferred); } return deferred.promise; }, /* Use this function in order to get instances of all the books */ loadAllBooks: function() { var deferred = $q.defer(); var scope = this; $http.get('ourserver/books) .success(function(booksArray) { var books = []; booksArray.forEach(function(bookData) { var book = scope._retrieveInstance(bookData.id, bookData); books.push(book); }); deferred.resolve(books); }) .error(function() { deferred.reject(); }); return deferred.promise; }, /* This function is useful when we got somehow the book data and we wish to store it or update the pool and get a book instance in return */ 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; }]); |
ÏÂÃæÊÇÎÒÃǵÄEditableBookControllerºÍBooksListControllerÁ½¸ö¿ØÖÆÆ÷µÄ´úÂ룺
EditableBookController and BooksListController
that uses booksManager
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; }]); |
ÐèҪעÒâµÄÊÇ£¬Ä£¿é£¨template£©Öл¹ÊDZ£³ÖÔÀ´Ê¹ÓÃbookʵÀýµÄ·½Ê½¡£ÏÖÔÚÓ¦ÓÃÖÐÖ»³ÖÓÐÒ»¸öidΪ1µÄbookʵÀý£¬Ëü·¢ÉúµÄËùÓиı䶼»á±»·´Ó³µ½Ê¹ÓÃËüµÄ¸÷¸öÒ³ÃæÉÏ¡£
×ܽá
ÔÚÕâÆ¬ÎÄÕÂÖУ¬ÎÒ½¨ÒéÁËAngularJSÖн¨Ä£Êý¾ÝµÄÒ»Öּܹ¹¡£Ê×ÏÈ£¬ÎÒչʾÁËAngularJSĬÈϵÄÊý¾ÝÄ£ÐͰ󶨣¬È»ºó½²ÁËÈçºÎ·â×°Ä£Ð͵ķ½·¨ºÍ²Ù×÷´Ó¶ø¿ÉÒÔÔÚ²»Í¬µÄ¿ØÖÆÆäÖÐÖØÓÃËüÃÇ£¬×îºóÎÒ½âÊÍÁËÈçºÎ¹ÜÀíÄ£ÐÍʵÀý´Ó¶øÊ¹µÃËùÓеĸı䶼Äܱ»·´Ó³µ½Ó¦ÓÃÖи÷¸öÏà¹ØµÄÊÓͼÉÏ¡£
Ï£ÍûÕâÆªÎÄÕÂÄÜÔÚÈçºÎʵÏÖÊý¾Ý½¨Ä£ÉϸøÄãһЩÆôʾ¡£ |