打鐵就要趁熱,
馬上再來一個應用範例來學習更多AngularJS的其他Directive,
這次要練習的範例是要完成一個簡單的動態新增物品存貨的列表,
這個範例所新增的的資料會僅在前端頁面顯示,不會與DB連線。
下面的範例會使用到ngRepeat, ngShow, ngHide, ngDblclick, ngBindTemplate,
接著按照慣例先來接紹這幾個Directive的功能。
將Collection中的所有物件巡覽過一次,
舉個例子來說,假設$scope裡有個itemList的集合,
那用ng-repeat時表示方法為ng-repeat="item in itemList",
在ng-repeat的區域裡就能夠使用item物件,
此外,repeat_expression有另一種表示方法,
直接尋覽資料集合,例如:(name, age) in {'A': 25, 'B': 26},
比較令人意外的是,AngularJS在1.2.1版以後就提供了ng-repeat-start,
類似ng-repeat的表示方法,不同的是使用ng-repeat-start與ng-repeat-end,
劃出要repeat的區段,
若expression判斷式值為true則顯示,反之不顯示。
兩個的用法都一樣,差別在於ngHide,
如果expression判斷式值為true則不顯示,反之則顯示
和JavaScriptOnClick事件類似,只要在在expression裡填入觸發的事件處理,
或呼叫Controller裡的Function。
先前在有提到,要將ngModel值印出來需要用{{model}}的方式,馬上再來一個應用範例來學習更多AngularJS的其他Directive,
這次要練習的範例是要完成一個簡單的動態新增物品存貨的列表,
這個範例所新增的的資料會僅在前端頁面顯示,不會與DB連線。
下面的範例會使用到ngRepeat, ngShow, ngHide, ngDblclick, ngBindTemplate,
接著按照慣例先來接紹這幾個Directive的功能。
ngRepeat
ngRepeat的功能可以把它當作C#中的foreach迴圈,將Collection中的所有物件巡覽過一次,
<ANY ng-repeat="{repeat_expression}">
...
</ANY>
repeat_expression為類似foreach迴圈內的表示式,舉個例子來說,假設$scope裡有個itemList的集合,
那用ng-repeat時表示方法為ng-repeat="item in itemList",
在ng-repeat的區域裡就能夠使用item物件,
此外,repeat_expression有另一種表示方法,
直接尋覽資料集合,例如:(name, age) in {'A': 25, 'B': 26},
比較令人意外的是,AngularJS在1.2.1版以後就提供了ng-repeat-start,
類似ng-repeat的表示方法,不同的是使用ng-repeat-start與ng-repeat-end,
劃出要repeat的區段,
<ANY ng-repeat-start="{repeat_expression}">
...
</ANY>
<ANY>
...
</ANY>
...
<ANY ng-repeat-end>
...
<ANY>
ngShow
ngShow可以根據expression內的判斷式值來顯示元件,若expression判斷式值為true則顯示,反之不顯示。
<ANY ng-show="{expression}">
...
</ANY>
ngHide
ngHide是與ngShow相反的directive,兩個的用法都一樣,差別在於ngHide,
如果expression判斷式值為true則不顯示,反之則顯示
<ANY ng-hide="{expression}">
...
</ANY>
ngDbclick
ngDbclick從名稱看來就可以猜到它是處理滑鼠Double Click事件的Directive,和JavaScriptOnClick事件類似,只要在在expression裡填入觸發的事件處理,
或呼叫Controller裡的Function。
<ANY ng-dblclick="{expression}">
...
</ANY>
ngBindTemplate
但如果當載入頁面時,AnguarJS的套件還沒Load進來,
HTML頁面顯示ngModel的部分就會變成{{model}},
我們不想讓使用者看到底層的東西,
這時候就要使用ngBindTemplate或ngCloak,
這兩個的功能在上述情況下,使用者不會看到{{model}}的字串,
相較之下,ngBindTemplate的彈性較好,
所以個人推薦使用ngBindTemplate,
ngBindTemplate使用方式如下:
<ANY ng-bind-template="{string}">
...
</ANY>
舉個例子, 假設我們設定:
<label ng-bind-template="Hello {{username}}"></label>,
以上執行結果會和<label>Hello {{username}}</label>一樣,
或者也可以將ng-bind-template想成C#中的Striing.Format()功能,
意思是建構一個字串Template。
以下程式碼為應用ngRepeat, ngShow, ngHide, ngDblclick, ngBindTemplate的範例:
index.html:
<!DOCTYPE html>
<html ng-app>
<head>
<link rel="stylesheet" href="style.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js"></script>
</head>
<script src="script.js"></script>
<body ng-controller="MyController">
<span>
<label></label>
<input type="text" placeholder="Name" ng-model="Item.Name"/>
<input type="text" placeholder="Count" ng-model="Item.Count"/>
<input type="button" value="Add" ng-click="AddItem(Item)"/>
</span><br/>
<table>
<thead>
<tr>
<th>Name</th>
<th>Count</th>
</tr>
<tr ng-repeat="item in itemList">
<td>
<span ng-dblclick="item.isEdit = !item.isEdit">
<label ng-bind-template="{{item.name}}" ng-show="!item.isEdit"></label>
<input type="text" ng-model="item.name" ng-hide="!item.isEdit"/>
</span>
</td>
<td>
<span ng-dblclick="item.isEdit = !item.isEdit">
<label ng-bind-template="{{item.count}}" ng-show="!item.isEdit" ng-dbclick="item.isEdit = !item.isEdit"></label>
<input type="text" ng-model="item.count" ng-hide="!item.isEdit"/>
</span>
</td>
<td ng-hide="!item.isEdit">
<input type="button" value="Save" ng-click="SaveValue(item)"/>
</td>
</tr>
</thead>
</table>
</body>
</html>
script.js:
function MyController($scope) {
$scope.itemList = [];
$scope.AddItem = function() {
this.itemList.push({name: this.Item.Name, count: this.Item.Count, isEdit: false});
this.Item = null;
}
$scope.SaveValue = function(item) {
if(item.name !== '' && item.count !== '') {
item.isEdit = false;
}
}
}
style.css:
table, th, td {
border: 1px solid blue;
}
執行結果:
| Name | Count | |
|---|---|---|
留言
張貼留言