1. 程式人生 > >Angular.js淺談

Angular.js淺談

cor npc {} 賦值 enc comm all cati conf

至今博主對於MVVM框架比較了解的就只能算有Angular了,首先給大家明確一個概念,Angular1.x才能叫Angular.js,而Angular2、4、5都直接叫Angular了,因為從2開始已經是用TypeScript開發的了,不能再稱它為js框架,值得肯定的是Ng2比Ng1.x的確更強大,更加規範,開發出來的應用的性能也相對變強了些,不過Ng2的太過激進的變動使得框架使用復雜度變大,1.x的用戶相當於要重新學習一種開發模式,用戶流失嚴重。


今天呢,我不在這裏做具體的功能介紹,這些沒什麽意思,就說一下Angular.js的優缺點吧~

優點:

首先Angular.js是前端三大框架最早出來的,這意味著它是前端這類框架創始的始祖,這個歷史地位還是值得我們尊重的。

1.它創新性地做出了雙向綁定的開發方式,{{}}這種寫法就是Angular率先提出的,這種可以雙向綁定js裏面的“變量”和HTML的數據顯示(這樣不需要我們再去自己操作dom,就可以更新頁面)

2.實現了依賴註入(依賴反轉,由函數來決定要什麽依賴)

缺點:

由於Angular太早出現,一些核心的代碼還是過於陳舊,從而有一些Vue、React沒有的Bug

1.事件、賦值、ng-repeat不能同時使用

<input type="button" ng-click="now=$index" ng-repeat="(k,v) in json" value="{{k}}">

以上會使得$scope.now無法賦值成功,這當然不是我們的問題,Vue,React,Ng2+都不會出現這種問題,要解決這個問題,我們要換一種寫法:

<input type="button"  ng-click="setIndex($index)" ng-repeat="(k,v) in json" value="{{k}}">

調用函數在函數內部完成賦值的工作。

2.異步數據不會自動同步

由於Angular1.x的雙向綁定依然使用舊的“臟檢查”,而不是新的Observation,如果我們自己寫異步獲取數據,或者其他庫的異步獲取數據(例如JQ的$.ajax({})),異步修改$scope上的數據,HTML上是無法自動更新的,我們需要在修改後,手動調用一次$scope.$apply(),當然我們可以使用Angular提供的$http,就可以不用寫手動觸發臟檢查了。

3.$http.post的Content-Type

Angular $http.post模塊默認設置的Header[‘Content-Type‘],居然是application/json,這個是大部分服務器不認,傳統的服務器認的是application/x-www-form-urlencoded

所以我們還要把默認設置自己給設置一遍:

angular.module(‘common‘,[]).config(function($httpProvider){
  $httpProvider.defaults.transformRequest=function(data){
    let temp = [];
    for(i in data){
      temp.push(encodeURIComponent(i)+‘=‘+encodeURIComponent(data[i]));
    }
    return temp.join(‘&‘);
  }
 $httpProvider.defaults.headers.post[‘Content-Type‘]=‘application/x-www-form-urlencoded‘;
})

我們要設置好transformRequest(數據傳出前的格式轉換)headers.post[‘Content-Type‘](數據格式是哪種),設置好了之後我們之後寫module的時候直接引入依賴就可以了:

angular.module(‘test1‘,[‘common‘]);

4.$http.jsonp 麻煩

let mod = angular.module(‘test‘,[]);
mod.controller(‘test_c‘,function($scope,$http,$sce){
    $scope.arr=[];
    $scope.keyword="";
    $scope.$watch(‘keyword‘,function(){
      let url = $sce.trustAsResourceUrl(`https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=${$scope.keyword}`);
      $http.jsonp(url,{jsonpCallbackParam:‘cb‘}).then(res=>{
          $scope.arr = res.data.s;
      },err=>{
          alert(‘錯了‘);
      });
    })
});

jsonp本來就是不安全的,但是感覺多此一舉的需要用$sce.trustAsResourceUrl包裹一下url,才能用{jsonpCallbackParam:‘cb‘}配置callback的名字。

Angular.js淺談