有用過 Smarty 的都知道 foreach 的好用,就像一般我們在寫程式中若需要做一些重覆性的輸出都會使用類似 for 或是 foreach 的功能,而 AngularJS 則是提供了 ng-repeat 來讓我們達到類似效果。
打開我們的 practice/index.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!doctype html> <html ng-app> <head> <meta charset="UTF-8"> <title>男丁格爾's 脫殼玩 - AngularJS</title> <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.min.js"></script> </head> <body> <div class="well span6" style="margin-top:20px;"> <ul> <li>男丁格爾</li> <li>jelly</li> <li>梅干桑</li> <li>莫希爾</li> </ul> </div> </body> </html> |
假設我們也想要產生一樣的清單的話,首先針對 div 加上 ng-controller:
1 | <div class="well span6" style="margin-top:20px;" ng-controller="FriendsCtrl"> |
然後加入個 js/controller.js,並產生一個相對應名稱的 Controller,再加入個簡單的 friends 陣列:
1 2 3 | var FriendsCtrl = function($scope){ $scope.friends = [ '男丁格爾', 'jelly', '梅干桑', '莫希爾' ]; }; |
接著,把 li 都刪除到只剩下一個,並加入宣告式語法 ng-repeat:
1 | <li ng-repeat="friend in friends">{{ friend }}</li> |
還記得嗎?friends 是個陣列,ng-repeat 會把陣列中的元素一一取出並放在 friend 上,它就等於是 model 的角色囉。
快來預覽吧:
是不是很方便呢!除了基本的取出之外,還能再搭配 $index 來輸出序號,就像 for 迴圈的 i 一樣:
1 | <li ng-repeat="friend in friends">[{{ $index + 1 }}] {{ friend }}</li> |
當然不是只有陣列可以這樣的迭代,物件也是可以的。像是我們把 friends 中的元素改成物件:
1 2 3 4 5 6 | $scope.friends = [ { name: '男丁格爾', age: 18 }, { name: 'jelly', age: 16 }, { name: '梅干桑', age: 30 }, { name: '莫希爾', age: 31 } ]; |
因為變成物件了,所以針對 friend 也可以用物件的方式來使用:
1 | <li ng-repeat="friend in friends">{{ friend.name }}({{ friend.age }})</li> |
有趣嗎?那麼讓我們在 ul 前面再新增一個輸入方塊吧:
1 2 3 | <label>Search:</label> <input type="text" ng-model="search"> <hr> |
這邊我們幫輸入方塊綁上一個名叫 search 的 model,在這邊主要是用在 ng-repeat 中的過濾器(Filters)使用,用法是:
1 | {{ expression | filters}} |
AngularJS 提供了一些基本的過濾或是轉換用的過濾器,常用的像是用來搜尋過濾用的 filter、限制資料數量的 limitTo 等等。所以筆者想將輸入方塊中輸入的內容當做查詢過濾清單使用:
1 | <li ng-repeat="friend in friends | filter:search">{{ friend.name }}({{ friend.age }})</li> |
將將~快看快看~
輸入的內容會立即反應在清單上,這就是資料綁定(Data-binding)的威力呢!
好啦~最後還是要來個簡單的題目:請在清單前面多加入一個 h5 元素,內容就是顯示出共有幾個清單項目。
本來想說"怎麼可能取得出數量",沒想到隨便寫寫就寫出來了...真有趣
噗~沒有想像中的難吧XD
也都只是一般的 JavaScript 基礎知識而已。
老師,請問一下,ANGULARJS有辦法動態用push的方式放入資料嗎?
例如我想要讓li ng-repeat出facebook上的朋友,有辦法動態載入嗎?
謝謝!
可以!你可以使用 Ajax 取得資料後再 push 到陣列中即可。
想請問,程式碼中的{{ friend.name }}。如果當使用者關閉瀏覽器的JavaScript功能時,就會直接把{{ friend.name }}整串顯示給使用者看,是否有辦法讓他變成空白之類的呢?
請使用 ngBindTemplate
將範例修改成
ng-repeat="friend in friends | filter:search" ng-bind-template="{{ friend.name }}({{ friend.age }})"
參考 ↓↓
https://docs.angularjs.org/api/ng/directive/ngBindTemplate
看過很多AngularJS的教學文,就屬您的說的最清楚易懂!
請問老師,現在想要做的就是ng-repeat
但若陣列是透過別台伺服器取得,有辦法嗎?
有看過資料並實驗過,http.get好像不能用於跨網域?
謝謝您的指導與分享!