Angular

介绍

AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。

使用

使用前需引入angular.js(尽量使用1.5、1.8版本,其他版本容易出问题)

M层

创建数据绑定

var app = angular.module('myApp',[]);

作用域注入(局部作用域)

//$scope代表局部作用域、$rootScope代表全局作用域
app.controller('myController',['$scope','$rootScope',function($scope,$rootScope){
      $scope.name = '仰光';
      $rootScope.age = '23';
}])

V层

<div ng-app="myApp" ng-controller="myController">
  {{name}}  //使用局部值name
</div>
<p>{{age}}</p> //使用全局age 不用注入作用域 ng-controller

监听

$scope.watch('$scope.eventName',function(newVal,oldVal){
         $scope.xx = newVal > 200 ? 0 : 20;
})
//事件监听 watch('事件名',callBackFn) 缺点:实时监听,浪费性能;

$timeout、$interval

由于angular中并不支持setTimeout和setInterval 因此被这两个替代

用法

    app.controller('myController',['$scope','$timeout','$interval',function(){
      $timeout(function(){
            console.log('This is a setTimeout');
      },1000)

      $interval(function(){
            console.log('This is a setInterval');
      },1000)
}])

循环

 app.controller('myController',function($scope){
#scope.dataList = {
   'namae' : '仰光',
   'age' : '23',
   'sex' : 'man'
   }
})
      <ul ng-controller="myController">
          <li ng-repeat="data in dataList">{{data}}<li>
     </ul>

http

$http.get('app.json').success(function(data){
 $scope.list = data;
})

绑定事件

<div ng-click='evenFn()'>{{content}}</div>
    app.controller('$scope',function($scope){
$scope.evenFn = function(){
     console.log('This is a click event');
}
})

手动初始化、绑定两个module

var m1 = angular.module(‘myApp1’,[]);
var m2 = angular.module(‘myApp2’,[]);
var div = document.getElementsByTagName(‘div’);

初始化:
document.onclick = function(){
angular.bootstrap(div[0],[‘myApp1’]);
angular.bootstrap(div[1],[‘myApp2’]);
}

路由 route

注意 引入的angular.js的版本要不小于angular.route.js的版本

单页应用spa

  <div id="box" ng-controller="myController">
    <a href="#/page1">首页</a>
    <a href="#/page2">内容1</a>
    <a href="#/page3">内容2</a>
 </div>
  <div ng-view></div>

var app = angular.module('myAapp',['ngRoute']);
app.controller('$scope',function($scope){})

路由的设置

  <div id="box">
    <a href="#/page1">首页</a>
    <a href="#/page2">内容1</a>
    <a href="#/page3">内容2</a>
  </div>
 <div ng-view></div>
  app.config(['$routeProvider',function($routeProvider){
   $routeProvider
.when('/page1',{             //当(when)我们点击page1时 模板内容显示
'template' : '<p>This is a index page</p>{{name}}',
'controller' : 'myController1'   //为每一个路由页面都绑定一个自己的作用域controller
     });
     .when('/page2',{
         'template' : '<p>This is a content page 1</p>',
         'controller' : 'myController2'              
     });
     .when('/page3',{
         'templage' : '<p>This is a content page 2</p>',
         'controller' : 'myController3'
     });
     .otherwise({redirectTo : '/page1'})  //页面加载进来时 显示/page1的内容
  }])

路由分别注入作用域 控制器的配置

              app.controller('myController1',function($scope){
               $scope.name="name1"
})
            app.controller('myController2',function($scope){
               $scope.name="name2"

})
            app.controller('myController3',function($scope){
               $scope.name="name3"

})

UI路由

 $stateProvider 当前页面跳转
 $urlRouterProvider 设置默认界面

.config(function($stateProvider,$urlRouterProvider){
    $stateProvider
         // state表示状态 'tab' 表示事件名 可以按自己意向设置
       .state('tab',{
         url : '/tab',  //访问时候的虚拟路径 虚拟文件夹
        abstract : true, // 用templateUrl的内容替换当前界面的内容
        templateUrl : '.../xx.html'
   })
       .state('tab.home',{
        url :'/home',
        views : {
            'tab-home' : {
                templateUrl : '.../tab01.html',
                controller : 'xxx'
            }
        }
    })
    $urlRouterProveider.otherwise('xxxxx/xx/html')
})

 icon-on icon-off
 上线下线图标切换    

返回上一级页面

$state.go(‘stateName’,{},{reload:true}) //跳转指定页面;
$ionicHistory.goBack(); //跳转历史页面,即进入这个页面前的那个页面

过滤器

数值

$scope.xx = $filter(‘number’)(数值,小数点保留个数,四舍五入)
$scope.number = $filter(‘number’)(1234.369,2) // 输出的值为1234.37

货币

$filter(‘currency’)(1000,’$’) //$1000
表达式内{name|currency:’$’}

时间

$filter(‘date’)(‘yy/MM/dd’); //小括号后面添加时间格式

大写、小写过滤器

$filter(‘uppercase’)(‘…’) //转换为大写
$filter(‘lowercase’)(‘…’) //转换为小写

排序

$filter(‘orderBy’)(collection,expression,reverse,comparator) // true == 降序 == reverse, false == 升序 == !reverse

过滤

$filter(‘filter’)(arr,’L’); //将数组中含有L的给过滤出来

限制过滤器

$filter(‘limitTo’)(input,limit,begin) //可以限制个数 $filter(‘limitTo’)(2);

自定义过滤器

自定义以首字母大写为例子

app.filter('firstUpper',function(){
  return function(str){
      return str.charAt(0).toUpperCase() + str.subString(1); //将str中的第一个字母大写拼接字符串中(n-1)后面的字符串
  }
})

调用 $filter(‘firstUpper’)(‘yangguang’); //输出 Yangguang

样式指令

 <h1 ng-style="myObj">
ABC
 </h1>

 $scope.myObj = {
    'background' : '#f00',
    'color' : '#ff0'   
 }


 <style>
.active{color:#000;}
 </style>
 <p ng-class="{{myClass}}"></p>

 $scope.myClass = {
  'active' : 'true'   // 'className' : '任意值'
 }

创建自定义格式

 app.directive('cf',[function(){
return{
    restrict : 'E',  // E:元素 A:属性 C:类名 M:注释
    replace : true,  //是否将自定义格式替换掉
    template : '<h1>替代模板</h1>'   //替代的模板
}
 }]);

 <cf></cf> 标签被替换为<h1>替代模板</h1>

作用域间的互相通信

向上通信

<body ng-app="myApp">
 <div ng-controller="myCtr">
     {{name}}
     <div ng-controller="myCtr" ng-click="fnAdd()">
         {{name}}
         <div ng-controller="myCtr">
             {{name}}
         </div>
     </div>
 </div>
         $scope.fnAdd = function(){
             $scope.name = $scope.name-1;
             $scope.$emit('upper',$scope.name); //$emit向上通信
         }
         $scope.$on('upper',function(){
             $scope.name = $scope.name+1;
         })

向下通信

$scope.fnAdd = function(){
    $scope.name = $scope.name-1;
    $scoppe.$broadcast('lower',$scope.name); //$broadcast向下通信
}
$scope.$on('lower',function(){
    $scope.name = $scope.name+1;
})

脏值、脏数据、脏数据检测

关键字 $watch监听 $digest修改

$watch之后会把值返回给$digest,$digest会把老值和新值进行比较,如果相同,不修改,不相同则就改,这个过程叫做脏数据处理;

坚持原创技术分享,您的支持将鼓励我继续创作!