亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

AngularJS語法詳解(續)

2019-11-20 13:19:59
字體:
來源:轉載
供稿:網友

src和href屬性

Angularjs中src應寫成ng-src,href應寫成ng-href 例如:

復制代碼 代碼如下:

<img ng-src="/images/cats/{{favoriteCat}}">
<a ng-href="/shop/category={{number}}">Some text</a>

表達式

在模板中可以進行簡單的數學運算、比較運算、布爾運算、位運算、引用數組、和對象符號等 盡管我們可以使用表達式做很多事情,但是表達式是使用一個自定義的解釋器來執行的(Angular的一部分),而不是用Javascript得eval()函數執行的,所以局限性較大。
雖然很多方面這里的表達式比Javascript更嚴格,但是他們對undefined和null的容錯性更好,如果遇到錯誤,模板只是簡單的什么都不顯示,而不會拋出一個NullPointerException錯誤。 例如:

復制代碼 代碼如下:

<div ng-controller='SomeController'>
    <div>{{computer() /10 }}</div> //雖然是合法的,但是它把業務邏輯放到模板中了,應避免這種做法
</div>

區分UI和控制器的職責

控制器是綁定在特定DOM片段上的,這些片段就是他們需要負責管理的內容。有兩種主要的方法可以把控制器關聯到DOM節點上,一種在模板中通過ng-controller聲明,第二種是通過路由把它綁定到一個動態加載的DOM模板片段上,這個模板叫視圖。 我們可以創建嵌套的控制器,他們可以通過繼承數結構來共享數據模型和函數,真實的嵌套發生在$scope對象上,通過內部的原始繼承機制,父控制器對象的$scope會被傳遞到內部嵌套的$scope(所有屬性,包括函數)。例如:

復制代碼 代碼如下:

<div ng-controller="ParentController">
    <div ng-controller="ChildController">...</div>
</div>

利用$scope暴漏模型數據

可以顯示創建$scope屬性,例如$scope.count = 5。還可以間接的通過模板自身創建數據模型。

通過表達式。例如

復制代碼 代碼如下:

<button ng-click='count=3'>Set count to three</button>

在表單項上使用ng-model

與表達式類似,ng-model上指定的模型參數同樣工作在外層控制器內。唯一的不同點在于,這樣會在表單項和指定的模型之間建立雙向綁定關系。

使用watch監控數據模型的變化

$watch的函數簽名是: $watch(watchFn,watchAction,deepWatch)
watchFn是一個帶有Angular表達式或者函數的字符串,它會返回被監控的數據模型的當前值。 watchAction是一個函數或者表達式,當watchFn發生變化時調用。其函數簽名為:
function(newValue,oldValue,scope) deepWatch 如果設置為true,這個可選的布爾值參數將會命令Angular去檢查被監控對象的每一個屬性是否發生了變化。如果你向監控數組中的元素,或者對象上的所有屬性,而不是值監控一個簡單的值,你就可以使用這個參數。注意,Angular需要遍歷數組或者對象,如果集合比較大,那么運算復雜呢就會比較的重。

$watch函數會返回一個函數,當你不需要接收變更通知時,可以用這個返回的函數注銷監控器。
如果我們需要監控一個屬性,然后接著注銷監控,我們就可以使用以下的代碼: var dereg = $scope.$watch('someModel.someProperty',callbackOnChange());
... dereg();

實例代碼如下:

復制代碼 代碼如下:

<html ng-app>
<head>
    <title>Your Shopping Cart</title>
    <script type="text/javascript">
        function CartController($scope) {
            $scope.bill = {};
            $scope.items = [
                {title:'Paint pots',quantity:8,price:3.95},
                {title:'Polka dots',quantity:17,price:12.95},
                {title:'Pebbles',quantity:5,price:6.95}
            ];
            $scope.totalCart = function() {
                var total = 0;
                for (var i=0,len=$scope.items.length;i<len;i++) {
                    total = total + $scope.items[i].price * $scope.items[i].quantity;
                }
                return total;
            }
            $scope.subtotal = function() {
                return $scope.totalCart() - $scope.bill.discount;
            }
            function calculateDiscount(newValue,oldValue,scope) {
                $scope.bill.discount = newValue > 100 ? 10 : 0;
            }//這里的watchAction函數
            $scope.$watch($scope.totalCart,calculateDiscount);//這里的watch函數
        }
    </script>
</head>
<body>
    <div ng-controller="CartController">
        <div ng-repeat='item in items'>
            <span>{{item.title}}</span>
            <input ng-model='item.quantity'>
            <span>{{item.price | currency}}</span>
            <span>{{item.price * item.quantity | currency}}</span>
        </div>
        <div>Total: {{totalCart()| currency }}</div>
        <div>Discount: {{bill.discount | currency}}</div>
        <div>SubTotal: {{subtotal() | currency}}</div>
    </div>
    <script type="text/javascript" src="angular.min.js"></script>
</body>
</html>

上面的watch存在性能問題,calculateTotals函數執行了6次,其中三次是因為循壞,每次循環,都會重新渲染數據。
下面是改良后的代碼

復制代碼 代碼如下:

<html ng-app>
<head>
    <title>Your Shopping Cart</title>
    <script type="text/javascript">
        function CartController($scope) {
            $scope.bill = {};
            $scope.items = [
                {title:'Paint pots',quantity:8,price:3.95},
                {title:'Polka dots',quantity:17,price:12.95},
                {title:'Pebbles',quantity:5,price:6.95}
            ];
            var totalCart = function() {
                var total = 0;
                for (var i=0,len=$scope.items.length;i<len;i++) {
                    total = total + $scope.items[i].price * $scope.items[i].quantity;
                }
                $scope.bill.totalcart = total;
                $scope.bill.discount = total > 100 ? 10 :0;
                $scope.bill.subtotal = total - $scope.bill.discount;
            }
            $scope.$watch('items',totalCart,true);//只用watch著items的變化
        }
    </script>
</head>
<body>
    <div ng-controller="CartController">
        <div ng-repeat='item in items'>
            <span>{{item.title}}</span>
            <input ng-model='item.quantity'>
            <span>{{item.price | currency}}</span>
            <span>{{item.price * item.quantity | currency}}</span>
        </div>
        <div>Total: {{bill.totalcart| currency }}</div>
        <div>Discount: {{bill.discount | currency}}</div>
        <div>SubTotal: {{bill.subtotal | currency}}</div>
    </div>
    <script type="text/javascript" src="angular.min.js"></script>
</body>
</html>

對于大型的itms數組來說,如果每次在Angular顯示頁面時只重新計算bill屬性,那么性能會好很多。通過創建一個帶有watchFn的$watch函數,我們可以實現這一點。

復制代碼 代碼如下:

$scope.$watch(
    var totalCart = function() {
                var total = 0;
                for (var i=0,len=$scope.items.length;i<len;i++) {
                    total = total + $scope.items[i].price * $scope.items[i].quantity;
                }
                $scope.bill.totalcart = total;
                $scope.bill.discount = total > 100 ? 10 :0;
                $scope.bill.subtotal = total - $scope.bill.discount;
            });

監控多個東西

如果你想監控多個屬性或者對象,并且當其中任何一個發生變化時就會去執行一個函數,你有兩種基本的選擇:

監控把這些屬性連接起來之后的值

把他們放在一個數組或者對象中,然后給deepWAtch參數傳遞一個值

分別說明:
在第一種情況下,如果你的作用域中存在一個things對象,它帶有兩個屬性a和b,當這兩個屬性發生變化時都需要執行callMe()函數,你可以同時監控這兩個屬性 $scope.$watch('things.a + things.b',callMe(...));
當列表非常長,你就需要寫一個函數來返回連接之后的值。

在第二種情況下,需要監控things對象的所有屬性,你可以這么做:

復制代碼 代碼如下:

$scope.$watch('things',callMe(...),true);

使用module組織依賴關系

provider(name,Object OR constructor()) 說明: 一個可配置的服務,創建邏輯比較的復雜。如果你傳遞了一個Object作為參數,那么這個Object對象必須帶有一個名為$get的函數,這個函數需要返回服務的名稱。否則,angularjs會認為你傳遞的時一個構造函數,調用構造函數會返回服務實例對象。
factory(name,$get Function()) 說明:一個不可配置的服務,創建邏輯比較的復雜。你需要指定一個函數,當調用這個函數時,會返回服務實例。可以看成provider(name,{$get:$getFunction()})的形式。
service(name,constructor()) 一個不可配置的服務,創建邏輯比較的簡單。與上面的provider函數的constructor參數類似,Angular調用他可以創建服務實例。

使用module factory的例子

復制代碼 代碼如下:

<html ng-app='ShoppingModule'>
<head>
<title>Your Shopping Cart</title>
<script type="text/javascript" src="angular.min.js"></script>
<script type="text/javascript">
    var ShoppingModule = angular.module('ShoppingModule',[]);
    ShoppingModule.factory('Items',function() {
        var  items = {};
        items.query = function() {
            return [
                {title:'Paint pots',description:'Pots full of Paint',price:3.95},
                {title:'Paint pots',description:'Pots full of Paint',price:3.95},
                {title:'Paint pots',description:'Pots full of Paint',price:3.95}
            ];
        };
        return items;
    });
    function ShoppingController($scope,Items) {
        $scope.items = Items.query();
    }
</script>
</head>
<body ng-controller='ShoppingController'>
<h1>Shop!!</h1>
<table>
    <tr ng-repeat='item in items'>
        <td>{{item.title}}</td>
        <td>{{item.description}}</td>
        <td>{{item.price | currency}}</td>
    </tr>
</table>
</body>
</html>

引入第三方模塊

在大多數應用中,創建供所有代碼使用的單個模塊,并把所有依賴的東西放入這個模塊中,這樣就會工作的很好。但是,如果你打算使用第三方包提供的服務或者指令,他們一般都帶有自己的模塊,你需要在應用模塊中定義依賴關心才能引用他們。 例如:
var appMod = angular.module('app',['Snazzy','Super']);

關于filter的例子

復制代碼 代碼如下:

<html ng-app='ShoppingModule'>
<head>
<title>Your Shopping Cart</title>
<script type="text/javascript" src="angular.min.js"></script>
<script type="text/javascript">
    var ShoppingModule = angular.module('ShoppingModule',[]);
    ShoppingModule.filter('titleCase',function() {
        var titleCaseFilter = function(input) {
            var words = input.split(' ');
            for(var i=0;i<words.length;i++) {
                words[i] = words[0].charAt(0).toUpperCase() + words[i].slice(1);
            }
            return words.join(' ');
        };
        return titleCaseFilter;
    });
    function ShoppingController($scope) {
        $scope.pageHeading = 'this is a test case';
    }
</script>
</head>
<body ng-controller='ShoppingController'>
<h1>{{pageHeading | titleCase}}</h1>
</body>
</html>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品久久久久秋霞蜜臀| 全球成人中文在线| 91精品国产一区| 日本视频久久久| 亚洲天堂av在线播放| 亚洲国产91精品在线观看| 亚洲国产小视频| 最新亚洲国产精品| 亚洲人成电影网站色xx| 国产免费久久av| 久久久噜噜噜久久| 精品日本高清在线播放| 日韩在线观看高清| 欧美精品在线播放| 国产99久久精品一区二区永久免费| 日韩免费高清在线观看| 国产成人午夜视频网址| 懂色aⅴ精品一区二区三区蜜月| 91精品久久久久久久久青青| 超碰日本道色综合久久综合| 久久久久亚洲精品成人网小说| 最近2019中文字幕第三页视频| 国产日韩欧美日韩| 国产精品国模在线| 2019中文字幕在线观看| 国产精品久久77777| 亚洲精选在线观看| 成人乱色短篇合集| 精品成人69xx.xyz| 国产成人+综合亚洲+天堂| 91精品在线观| 国产一区二区三区四区福利| 亚洲摸下面视频| 国内精品久久久久| 久久中国妇女中文字幕| 上原亚衣av一区二区三区| 最近2019中文字幕大全第二页| 中文字幕一精品亚洲无线一区| 国产成人精品在线播放| 欧美黑人巨大精品一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 日本精品一区二区三区在线播放视频| 57pao成人国产永久免费| 91精品国产高清久久久久久久久| 69**夜色精品国产69乱| 国产精品啪视频| 国产精品成久久久久三级| 在线视频精品一| 久久综合色影院| 97成人超碰免| 久久精品亚洲94久久精品| 午夜精品一区二区三区在线视| 亚洲精品国产精品久久清纯直播| 久久成人精品电影| 国产精品美女久久久久av超清| 久热精品在线视频| 日韩电影网在线| 中文日韩电影网站| 九九久久久久99精品| 4438全国亚洲精品在线观看视频| 国产亚洲福利一区| 亚洲欧洲激情在线| 日韩av在线影视| 高清一区二区三区日本久| 日韩一区二区三区在线播放| 国产成人一区二区三区| 日韩小视频在线| 亚洲国产精品女人久久久| 欧美成人黑人xx视频免费观看| 精品国产一区二区三区久久久| 欧美一区二粉嫩精品国产一线天| 日韩av最新在线| 911国产网站尤物在线观看| 国产成人中文字幕| 亚洲第一福利视频| 亚洲精品一二区| 精品国偷自产在线| 97香蕉超级碰碰久久免费软件| 91手机视频在线观看| 欧美性xxxxxxx| 美女扒开尿口让男人操亚洲视频网站| 亚洲第一区中文字幕| 亚州成人av在线| 国产精品美女av| 亚洲aⅴ男人的天堂在线观看| 久久免费视频在线观看| 欧美日韩第一视频| 欧美大片在线看免费观看| 欧美成年人视频| 亚洲综合成人婷婷小说| 国产精品igao视频| 欧美亚洲视频在线看网址| 欧美大片va欧美在线播放| 在线视频中文亚洲| 欧美亚洲另类视频| 亚洲精品按摩视频| 91精品国产91久久久久久不卡| 欧美日韩国产二区| 日韩精品视频在线免费观看| 国产亚洲人成a一在线v站| 国产精品久久久久久超碰| 久久精品99国产精品酒店日本| 红桃av永久久久| 亚洲乱码av中文一区二区| 神马国产精品影院av| 国产成人精品a视频一区www| 在线成人一区二区| 日韩最新免费不卡| 亚洲精品美女视频| 日韩av在线网| 成人福利网站在线观看| 久久在线精品视频| 国产91精品高潮白浆喷水| 日韩成人中文字幕在线观看| 亚洲尤物视频网| 国产xxx69麻豆国语对白| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国产精久久久久久| 日韩在线国产精品| 97精品一区二区视频在线观看| 国内精品中文字幕| 亚洲欧美日韩久久久久久| 亚洲欧美日韩精品久久亚洲区| 激情亚洲一区二区三区四区| 精品欧美激情精品一区| 亚洲精品黄网在线观看| 日韩精品日韩在线观看| 热久久免费国产视频| 亚洲毛片在线观看| 中日韩美女免费视频网址在线观看| 国产亚洲人成a一在线v站| 色综合久久悠悠| 青青草成人在线| 国产99久久精品一区二区 夜夜躁日日躁| 在线观看精品自拍私拍| 狠狠久久五月精品中文字幕| 欧美激情18p| 亚洲一区二区三区四区在线播放| 91av在线免费观看| 亚洲精品电影网在线观看| 91豆花精品一区| 欧美日韩国产一区在线| 国产精品视频最多的网站| 欧美一区二粉嫩精品国产一线天| 久久福利视频网| 久青草国产97香蕉在线视频| 欧美精品午夜视频| 97国产精品人人爽人人做| 55夜色66夜色国产精品视频| 亚洲国产成人爱av在线播放| 亚洲18私人小影院| 日韩在线观看你懂的| 日韩中文av在线| 97国产在线视频| 久久久久国色av免费观看性色| 国产精品免费小视频| 国产区亚洲区欧美区| 国产日韩亚洲欧美| 亚洲经典中文字幕| 亚洲性无码av在线| 亚洲毛茸茸少妇高潮呻吟| 国产精品老牛影院在线观看| 97国产精品视频| 亚洲成人精品视频在线观看|