国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

AngularJS1.3一些技巧

Original 2016-11-11 13:34:42 507
abstract:前言     框架選擇。在上一篇文章評論中,有人說angular1.3是個過時的東西,建議使用angular2。其實這種說法很像拿jQuery1.x和jQuery2.x做比較,新的版本當然會有優(yōu)化優(yōu)勢的地方,但并不一定是最適合你項目的。當你項目必須支持IE6/7/8時,那又得使用jQuery1.x版本。所以不要以新不新去選擇一個框架或者某個版本,而是看是不是適合的。當

前言

     框架選擇。在上一篇文章評論中,有人說angular1.3是個過時的東西,建議使用angular2。其實這種說法很像拿jQuery1.x和jQuery2.x做比較,新的版本當然會有優(yōu)化優(yōu)勢的地方,但并不一定是最適合你項目的。當你項目必須支持IE6/7/8時,那又得使用jQuery1.x版本。所以不要以新不新去選擇一個框架或者某個版本,而是看是不是適合的。當初用angular1.3是他比較成熟有配套的文檔,而angular2的文檔是不健全的,另外有一點是1.x與2.x的區(qū)別太大了,兩者的用法沒有繼承性。更重要的是,目前的angular2只有Alpha版本(測試),并沒有一個正式版本。

     性能。有人說angular2的性能會比較好,我還沒有用過,不做什么評論。但對于angular1.x,我確實是不放心它的性能的,作為PC Web我敢用angular,但在移動終端我不敢用,在我看來無論從框架體積或框架運行效率,在脆弱的移動端都是致命的。有一些基于angular做的Hybrid框架(例Ionic),希望使用過的人能告訴我它體驗怎么樣(性能上)。

一些技巧

     這篇文章記錄一些angular1.3的小技巧,angular2我會找個時間做個實踐。

1. ng-repeat多個字段排序的寫法

使用orderBy過濾器,第一個參數(shù)是一個數(shù)組,表示依次按數(shù)組中的屬性值進行排序(若按第一項比較的值相等,再按第二項比較),第二個參數(shù)是正序還是倒序(默認是正序)。

ng-repeat="groupUser in groupUsers | orderBy:['isOwner','isAdmin']:true"

2. ng-include引入HTML片段

使用ng-include,第一個參數(shù)是頁面的相對地址的字符串。應該注意,是一個字符串,不是ng-expression,所以不要忘了加單引號,否則會發(fā)現(xiàn)怎么都引不進這個HTML片段。

<div ng-include="'msgs.html'"></div>

3. ng-bind的$scope對象沒有隨著數(shù)據(jù)變化而變化

自己實現(xiàn)的ajax,獲取數(shù)據(jù)后,設(shè)置到$scope上,view卻沒有更新。這其實就是angular雙向數(shù)據(jù)的原因,angular不可預見的scope變化,是不會幫忙刷新view的(例$.ajax或setTimeout)。解決方法就是,數(shù)據(jù)設(shè)置到$scope上后,手動調(diào)$scope.$apply();。

PS:一些指令(例ng-click、ng-model)以及服務(wù)(例$timeout、$http)才會自動刷新view。

4. 移動觸摸(Touch)事件

angular-touch模塊提供了觸摸的事件和其他手勢ngSwipeLeft、ngSwipeRight。

5. ng-bind-html的內(nèi)容無法正常的顯示在頁面中

使用ng-bind-html屬性,該屬性依賴于$sanitize,也就是需要引入angular-sanitize.js文件。但會發(fā)現(xiàn)ng-bind-html的內(nèi)容無法正常的顯示在頁面中,這是因為某些標簽會被angularJS認為是不安全的自動過濾掉,而為了保留這些表情就需要開啟非安全模式。

<div ng-bind-html="article.content | trustHtml"></div>
myApp.filter('trustHtml', function ($sce) {    return function (input) { 
        return $sce.trustAsHtml(input);
    }
});

其中$sce是angular自帶的安全處理服務(wù),$sce.trustAsHtml(input) 返回的是受信任的對象。

6.  如何劃分一個module

我的想法是在關(guān)系比較密切(業(yè)務(wù)邏輯)的頁面可以劃為一個module,因為頁面可能存在共用service或template或directive(controller不共用),而這些元件歸屬于同個module,我們就可以不同頁面調(diào)用了。而不想關(guān)的頁面可劃分為另一個module,增加代碼的清晰度。

7. 是否要把工具類弄成service

在弄工程之前,我會考慮到是否要將一些工具類封裝成一個service(為了看起來代碼統(tǒng)一),但我發(fā)覺是沒有必要的,因為service是歸屬于某個模塊的,而我們的工具類可能在不同模塊都有使用,不歸屬于某個模塊。把工具類當成一個jquery的庫引入即可。

8. 配合RequireJS使用

angular沒有異步加載模塊的功能,所以使用配合RequireJS使用的效果還是不錯的。在這里面有些異議的是對于模塊定義的地方,是該把一個模塊定義成RequireJS的模塊還是angular的服務(wù)(可以依賴注入),我覺得還是功能歸屬的問題,如果是全局使用的工具服務(wù),就定義成RequireJS模塊,而如果是與模塊密切相關(guān)的業(yè)務(wù)邏輯就使用服務(wù)。

PS:可在RequireJS的config加上urlArgs,可以避免緩存問題。

urlArgs: "bust=" +  (new Date()).getTime()  //可用來清理緩存,在部署到生產(chǎn)環(huán)境去掉。

9. iframe打開跨域URL時報錯

<iframe width="100%" height="100%" ng-src="{{url}}"></iframe>

如果不做處理,上面的跨域URL是打不開的, 需要定義白名單。

myApp.config(function($sceDelegateProvider) {
        $sceDelegateProvider.resourceUrlWhitelist([            // Allow same origin resource loads.
            'self',            // Allow loading from our assets domain.  Notice the difference between * and **.
            "https://link.bingosoft.net/**"]);
 });

10. 使用其他Controller的scope的屬性方法

先聲明我并不清楚我的用法是否恰當。使用其他Controller的scope局限于其parent scope,而不是任何Controller的都可以訪問。scope有個屬性$parent, 通過這個屬性可以找到某一層Controller的scope。

var parentScope = $scope.$parent.$parent.$parent;

PS:多少層$parent是我打印scope對象出來找的。

11. form表單的自動提交功能

在輸入框點擊回車時候,AngularJS會默認觸發(fā)第一個button的click事件。

總結(jié)

這一篇是angular1.3的小技巧,希望有用。


Release Notes

Popular Entries