Artikel ini akan membawa anda melalui pandangan dan arahan dalam Angularjs saya harap ia akan membantu anda!
Dalam artikel pertama anda melihat cara AngularJS membahagikan aplikasi kepada paparan, Pengawal dan Model (MVC). Artikel ini akan menyelami cara membuat paparan AngularJS. [Cadangan tutorial berkaitan: "tutorial sudut"]
Sebelum bermula, izinkan saya sediakan aplikasi AngularJS ringkas dahulu yang boleh anda gunakan untuk mengalami contoh dalam artikel ini:
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.5/angular.min.js"></script> </head> <body ng-app="myapp"> <div ng-controller="MyController" > <span></span> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { //empty controller function }); </script> </body> </html>
AngularJS Views mencampurkan data daripada model ke dalam templat HTML. Anda boleh menggunakan arahan AngularJS untuk memberitahu AngularJS cara mencampur data ke dalam templat HTML. Artikel ini akan merangkumi arahan AngularJS yang paling biasa digunakan.
Arahan interpolasi
Arahan interpolasi ialah salah satu arahan paling asas dalam AngujarJS. Arahan interpolasi memasukkan hasil ungkapan ke dalam templat HTML. Anda boleh menggunakan simbol {{ }}
untuk menandakan tempat anda memasukkan ungkapan. Berikut ialah contoh:
<div ng-controller="MyController" > <span> {{myData.text}} </span> </div>
Templat HTML terkandung dalam elemen div
dengan atribut ng-controller
. Di dalam templat HTML ialah elemen span
, dan di dalamnya ialah arahan interpolasi. Arahan ini mengarahkan AngularJSmyData.text
untuk memasukkan nilai data pada kedudukan yang diberikan.
Arahan interpolasi juga boleh menginterpolasi data yang dikembalikan daripada fungsi objek model. Berikut ialah contoh:
<div ng-controller="MyController" > <span>{{myData.textf()}}</span> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.textf = function() { return "A text from a function"; }; }); </script>
Dalam contoh ini, arahan interpolasi {{myData.textf()}}
akan memanggil fungsi myData.textf()
pada objek model $scope
dan memasukkan teks yang dikembalikan daripada fungsi ke tengah templat HTML .
Fungsi textf()
dimasukkan ke dalam objek di dalam fungsi pengawal $scope.myData
, seperti yang anda lihat dalam contoh.
ng-bind directive
Arahan ng-bind
ialah pengganti kepada arahan interpolasi. Anda boleh menggunakan ini dengan ng-bind
memasukkan atribut dalam elemen HTML yang anda mahu AngularJS memasukkan data. Berikut ialah contoh:
<div ng-controller="MyController" > <span ng-bind="myData.textf()"></span> </div>
Ini akan memasukkan data yang dikembalikan oleh fungsi myData.text()
ke dalam badan elemen span
. Sila ambil perhatian bahawa {{ }}
mengelilingi ungkapan dalam atribut ng-bind
tidak diperlukan.
Jika data yang diperoleh daripada model mengandungi elemen HTML, elemen ini akan terlepas sebelum dimasukkan ke dalam templat HTML. Melarikan diri bermakna HTML dipaparkan sebagai teks, bukan HTML.
Ini dilakukan untuk mengelakkan serangan suntikan HTML. Contohnya, dalam aplikasi sembang, seseorang mungkin <script>
memasukkan elemen dengan JavaScript ke dalam mesej sembang. Jika elemen ini tidak terlepas, sesiapa yang melihat mesej sembang boleh <script>
melaksanakan elemen tersebut. Dengan HTML melarikan diri, elemen <script>
hanya akan muncul sebagai teks.
Anda boleh melumpuhkan HTML melarikan diri menggunakan arahan ng-bind-html-unsafe
, seperti yang ditunjukkan di bawah:
<div ng-controller="MyController" > <span ng-bind-html-unsafe="myData.textf()"></span> </div>
Anda harus berhati-hati apabila melumpuhkan HTML melarikan diri. Pastikan tiada HTML yang tidak dipercayai dipaparkan.
AngularJS boleh menunjukkan atau menyembunyikan HTML berdasarkan keadaan data dalam model. Anda boleh menggunakan satu set arahan AngularJS yang dibuat khusus untuk tujuan ini. Saya akan merangkumi arahan ini dalam bahagian berikut.
ng-tunjuk ng-hide arahan
daripada ng-show
dan ng-hide
Arahan digunakan untuk menunjukkan atau menyembunyikan elemen HTML berdasarkan data dalam model. Kedua-dua arahan ini melakukan perkara yang sama tetapi bertentangan antara satu sama lain. Berikut ialah dua contoh:
<div ng-controller="MyController" > <span ng-show="myData.showIt"></span> <span ng-hide="myData.showIt"></span> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.showIt = true; }); </script>
Contoh ini mencipta dua span
elemen. Satu mempunyai arahan ng-show
dan satu lagi mempunyai arahan ng-hide
. Kedua-dua arahan melihat myData.showIt
pembolehubah boolean untuk menentukan sama ada mereka harus menunjukkan atau menyembunyikan elemen span
. Arahan ng-show
akan menunjukkan elemen jika nilai model adalah benar dan menyembunyikan elemen jika nilai model adalah palsu. Arahan ng-hide
akan melakukan sebaliknya: span
sembunyikan elemen jika nilai model adalah benar, tunjukkan jika nilai model adalah palsu.
注意控制器函数如何将 设置myData.showIt
为true
。这意味着上面的示例将显示第一个 span 元素并隐藏第二个。
HTML 元素(span
在本例中为元素)使用 CSS 属性隐藏display: none;
。这意味着 HTML 元素仍然存在于 DOM 中。它们只是不可见。
ng-switch 指令
ng-switch
如果您想根据模型中的数据从 DOM 中添加或删除 HTML 元素,则使用 该指令。下面是一个例子:
<div ng-controller="MyController" > <div ng-switch on="myData.switch"> <div ng-switch-when="1">Shown when switch is 1</div> <div ng-switch-when="2">Shown when switch is 2</div> <div ng-switch-default>Shown when switch is anything else than 1 and 2</div> </div> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.switch = 3; }); </script>
此示例包含一个div
具有ng-switch
属性和on
属性的元素。该on
属性指示要打开模型中的哪些数据。
div
元素 内部是三个嵌套div
元素。前两个嵌套div
元素包含一个ng-switch-when
属性。该属性的值告诉on
父属性中引用的模型数据div
应该具有什么值,以便嵌套div
可见。在此示例中,第一个嵌套div
在myData.switch
为 1时可见,第二个嵌套div
在myData.switch
为 2时可见。
该third
嵌套div
有一个ng-switch-default
属性。如果没有其他ng-switch-when
指令匹配,则显示div
withng-switch-default
属性。
在上面的示例中,控制器函数设置myData.switch
为 3。这意味着将显示嵌套div
的ng-switch-default
属性。另外两个嵌套div
元素将从 DOM 中完全删除。
ng-if 指令
该ng-if
指令可以包括/从DOM删除HTML元素,就像ng-switch
指令,但它有一个简单的语法。下面是一个例子:
<div ng-controller="MyController" > <div ng-if="myData.showIt">ng-if Show it</div> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.showIt = true; }); </script>
ng-if
和ng-show
+ 之间的主要区别ng-hide
是 ng-if
从 DOM 中完全删除 HTML 元素,而ng-show
+ ng-hide
只是将 CSS 属性display: none;
应用于元素。
ng-include 指令
该ng-include
指令可用于将来自其他文件的 HTML 片段包含到视图的 HTML 模板中。下面是一个例子:
<div ng-controller="MyController" > <div ng-include="'angular-included-fragment.html'"></div> </div>
T此示例将文件包含angular-included-fragment.html
到div
具有ng-include
属性的 HTML 模板内。注意文件名是如何引用的(单引号)。
您可以根据条件包含 HTML 片段。例如,您可以在两个文件之间进行选择,如下所示:
<div ng-controller="MyController" > <div ng-include="myData.showIt && 'fragment-1.html' || 'fragment-2.html'"></div> </div> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.showIt = true; }); </script>
此示例将包括fragment-1.html
ifmyData.showIt
为 true 和fragment-2.html
ifmyData.showIt
为 false。
ng-repeat 指令
该ng-repeat
指令用于迭代一组项目并从中生成 HTML。在初始生成之后,ng-repeat
监视用于生成 HTML 的项目的更改。如果项目发生变化,该ng-repeat
指令可能会相应地更新 HTML。这包括重新排序和删除 DOM 节点。
这是一个简单的ng-repeat
例子:
<ol> <li ng-repeat="theItem in myData.items">{{theItem.text}}</li> </ol> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.items = [ {text : "one"}, {text : "two"}, {text : "three"} ]; }); </script>
此示例将为数组中的li
每个项目创建一个元素myData.items
。
您还可以迭代从函数调用返回的集合。下面是一个例子:
<ol> <li ng-repeat="theItem in myData.getItems()">{{theItem.text}}</li> </ol> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.items = [ {text : "one"}, {text : "two"}, {text : "three"} ]; $scope.myData.getItems = function() { return this.items; }; }); </script>
您可以使用稍微不同的语法迭代 JavaScript 对象的属性:
<ol> <li ng-repeat="(name, value) in myData.myObject">{{name}} = {{value}}</li> </ol> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.myObject = { var1 : "val1", var2 : "val3", var3 : "val3"}; }); </script>
注意指令的(name, value)
部分ng-repeat
。这会通知 AngularJS 迭代对象的属性。该name
参数将被绑定到的属性名称和value
参数将被绑定到的属性值。该name
和value
参数可以输出到HTML模板,就像任何其他JavaScript变量或对象的属性,你可以从上面的HTML模板见。
特殊的 ng-repeat 变量
该ng-repeat
指令定义了一组特殊变量,您可以在迭代集合时使用这些变量。这些变量是:
该$index
变量包含被迭代元素的索引。
的$first
,$middle
并且$last
包含根据当前的项目是否正在迭代集合中的第一,中间或最后一个元素的布尔值。如果一个项目既不是第一个也不是最后一个,它就是“中间”。您可以使用这些变量使用例如生成不同的HTML ng-show
/ ng-hide
,ng-switch
, ng-if
和ng-include
指令如前所述。
重复多个元素
到目前为止,您只看到了如何使用ng-repeat
. 如果您想重复多个 HTML 元素,您必须将这些元素嵌套在容器元素中,并让容器元素具有该ng-repeat
元素,如下所示:
<div ng-repeat="(name, value) in myData.myObject"> <div>{{name}}</li> <div>{{value}}</li> </div>
但是,将要重复的元素包装在根元素中可能并不总是可行的。因此 AngularJS 有ng-repeat-start
和ng-repeat-end
指令,用于标记开始和结束重复的元素。下面是一个例子:
<ol> <li ng-repeat-start="(name, value) in myData.myObject">{{name}}</li> <li ng-repeat-end>{{value}}</li> </ol>
此示例将为 中的li
每个属性重复这两个元素 myData.myObject
。
上面介绍的一些指令支持过滤。本节将解释过滤的工作原理。
该ng-repeat
指令可以接受这样的过滤器:
<div ng-repeat="item in myData.items | filter: itemFilter"></div>
注意| filter: itemFilter
上面声明的部分。那部分是过滤器定义。该| filter:
部分告诉 AngularJS 将过滤器应用于 myData.items
数组。该itemFilter
是过滤函数的名称。此函数必须存在于$scope
对象上,并且必须返回 true 或 false。如果过滤器函数返回 true,则ng-repeat
指令使用数组中的元素。如果过滤器函数返回 false,则忽略该元素。下面是一个例子:
<script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.items = [ {text : "one"}, {text : "two"}, {text : "three"}, {text : "four"} ]; $scope.itemFilter = function(item) { if(item.text == "two") return false; return true; } } }); </script>
格式化过滤器
AngularJS 带有一组内置格式过滤器,可以与插值指令和ng-bind
. 以下是格式过滤器的列表:
过滤器 | 说明 |
---|---|
date | 根据给定的日期格式将变量格式化为日期 |
currency | 将变量格式化为带有货币符号的数字 |
number | 将变量格式化为数字 |
lowercase | 将变量转换为小写 |
uppercase | 将变量转换为大写 |
json | 将变量转换为 JSON 字符串 |
这是一个日期过滤器示例:
<span>{{myData.theDate | date: 'dd-MM-yyyy'}}</span>
此示例显示了date
可以根据| date:
部分后给出的日期格式模式格式化 JavaScript 日期对象的过滤器。它是myData.theDate
将被格式化为日期的属性。因此,它必须是一个 JavaScript 日期对象。
这是一个数字过滤器示例:
<span>{{myData.theNumber | number: 2}}</span>
此示例将myData.theNumber
变量格式化为带有 2 个小数位的数字。
下面是一个小写和大写过滤器示例:
<span>{{myData.mixedCaseText | lowercase}}</span> <span>{{myData.mixedCaseText | uppercase}}</span>
数组过滤器
AngularJS 还包含一组过滤或转换数组的数组过滤器。这些过滤器是:
数组过滤器:
过滤器 | 说明 |
---|---|
limitTo | 将数组限制为给定的大小,从数组中的某个索引开始。该limitTo 过滤器也适用于字符串。 |
filter | 通用过滤器。 |
orderBy | 根据提供的条件对数组进行排序。 |
下面是一个limitTo
例子:
<span>{{myData.theText | limitTo: 3}}</span>
这将$scope
myData.theText
变量限制为 3 个字符的长度。如果将此过滤器应用于数组,则该数组将被限制为 3 个元素。
该filter
过滤器是一种特殊的过滤器,可以做很多不同的事情。在最简单的形式中,它只是调用$scope
对象上的函数。此函数必须返回true
or false
。如果过滤器接受传递给它的值,则返回 True。如果过滤器不能接受该值,则返回 False。如果过滤器不能接受该值,则该值不包含在过滤产生的数组中。下面是一个例子:
<ol> <li ng-repeat="item in myData.items | filter:filterArray"> {{item.text}} : {{$first}}, {{$middle}}, {{$last}} </li> </ol> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.items = [ {text : "one"}, {text : "two"}, {text : "three"}, {text : "four"} ]; $scope.filterArray = function(item) { if(item.text == "two") return false; return true; } } ); </script>
此示例调用filterArray()
过滤掉具有text
值为的属性的项目 的函数two
。
下面是一个orderBy
例子:
<ol> <li ng-repeat="item in myData.items | orderBy:sortField:reverse"> {{item.text}} : {{$first}}, {{$middle}}, {{$last}} </li> </ol> <script> angular.module("myapp", []) .controller("MyController", function($scope) { $scope.myData = {}; $scope.myData.items = [ {text : "one"}, {text : "two"}, {text : "three"}, {text : "four"} ]; $scope.sortField = "text"; $scope.reverse = true; } ); </script>
所述orderBy
过滤器可以接受一个$scope
变量作为参数。在此示例中,该变量名为sortField
。此变量的值是已排序数据对象的属性名称,用于对数据对象进行排序。在此示例中,sortField
属性设置为text
这意味着数据对象的text
属性用于对数据对象进行排序。
该orderBy
过滤器还可以采取的第二$scope
变量作为参数。在此示例中,该变量名为reverse
。该变量的值决定了数据对象是按自然顺序排序,还是按自然顺序排序。在这种情况下,reverse
变量设置为true
,这意味着数据对象将按相反顺序排序。
链接过滤器
可以通过简单地在过滤器部分中一个接一个地放置更多过滤器来链接过滤器。链接过滤器时,一个过滤器的输出用作链中下一个过滤器的输入。下面是一个例子:
<span>{{myData.theText | limitTo: 5 | uppercase}}</span>
此示例首先myData.theText
使用limitTo
过滤器将字符串限制为 5 个字符,然后使用 过滤器将 5 个字符转换为大写uppercase
。
将过滤器输出分配给变量
可以将过滤器的输出分配给一个临时变量,然后您可以稍后在视图中引用该变量。下面是一个例子:
<ol> <li ng-repeat="item in filteredItems = ( myData.items | filter:filterArray) "> {{item.text}} : {{$first}}, {{$middle}}, {{$last}} </li> </ol> <div>{{filteredItems.length}}</div>
此示例将过滤的输出分配给filteredItems
变量。该示例然后{{ }}
在ol
元素下的指令内引用此变量。
实现自定义过滤器
如果 AngularJS 过滤器不适合您的需要,您可以实现自己的过滤器。下面是一个例子:
<div>Filtered: {{myData.text | myFilter}}</div> <script> var module = angular.module("myapp", []); module.filter('myFilter', function() { return function(stringValue) { return stringValue.substring(0,3); }; }); </script>
此示例向 AngularJS 注册了一个过滤器,它可以过滤字符串。过滤器返回字符串的前 3 个字符。过滤器以 name 注册myFilter
。正如您在过滤器开头看到的那样,您在引用过滤器时必须使用该名称。
如果您的过滤器需要更多的输入参数,请在过滤器函数中添加更多参数,并在过滤器名称和:
引用它时添加参数。下面是一个例子:
<div>Filtered: {{myData.text | myFilter :2:5}}</div> <script> var module = angular.module("myapp", []); module.filter('myFilter', function() { return function(stringValue, startIndex, endIndex) { return stringValue.substring(parseInt(startIndex), parseInt(endIndex)); }; }); </script>
注意过滤器引用 ( | myfilter:2:5
) 现在在过滤器名称后面有两个值,每个值用冒号分隔。这两个值作为参数传递给过滤器。还要注意 filter 函数现在如何接受两个名为startIndex
和 的额外参数endIndex
。这两个参数用于确定字符串的哪一部分作为子字符串从过滤器返回
更多编程相关知识,请访问:编程入门!!
Atas ialah kandungan terperinci Selami pandangan dan arahan dalam Angularjs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!