Angular.js淺談

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


 

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

優勢:json

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

1.它創新性地作出了雙向綁定的開發方式,{{}}這種寫法就是Angular率先提出的,這種能夠雙向綁定js裏面的「變量」和HTML的數據顯示(這樣不須要咱們再去本身操做dom,就能夠更新頁面)服務器

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

 

缺點:框架

因爲Angular太早出現,一些核心的代碼仍是過於陳舊,從而有一些Vue、React沒有的Bugdom

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

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

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

<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的名字。

相關文章
相關標籤/搜索