angularjs 基础认识

angularjs 是目前比较流行的前端框架之一,angularjs是程序员应该要懂得使用和掌握的一门技术。对自己学习过程记录下来,方便查阅和巩固知识。
1. angularjs引入
官网下载angular文件,在页面引入angular。后面三个非必须。

<script type="text/javascript" src="/src/js/lib/angular/1.5.11/angular.min.js"></script>
<script type="text/javascript" src="/src/js/lib/angular/1.5.11/angular-route.min.js"></script>
<script type="text/javascript" src="/src/js/lib/angular/1.5.11/angular-animate.min.js"></script>
<script type="text/javascript" src="/src/js/plugins/angular-ui-bootstrap-2.5.0/js/ui-bootstrap-tpls-2.5.0.min.js"></script>
2. controller

controller由javascript的构造函数定义,主要用于增强angular的scope。
使用controller的情况:

  • $scope中对象的初始化
  • 给$scope中对象增加一些行为(方法)
var myApp = angular.module('mainApp', []);

myApp.controller('myController', ['$scope', function($scope) {
    $scope.name = 'harry';//对象初始化,多个依赖注入的顺序是angular提供的先写,自己的service后写

    //在$scope上定义一个行为(函数)
    $scope.putName = function(name) {
        $scope.name = name;
    };
}]);

页面如:

<div ng-app="mainApp" ng-controller="myController">
     <input ng-model="name">
     <button ng-click="putName('chili')">Chili</button>
     <button ng-click="putName(name)">Custom spice</button>
</div>

controller里创建一个 scope scope。$scope都可以访问比他更高层级controller定义的属性和方法。

3. service

angular的service是作为单例对象在需要的时候被创建。通过三种方式创建
1. factory()
controller的factory方式创建,factory主要用来存储少量的方法或者数据,例如只定义一个方法等
注意:需要使用.config()来配置service的时候不能使用factory()方法

var app = angular.module('mainApp',[]);
app.factory('service1',["$rootScope",function($rootScope) {
    var obj = {
        user = {},//数据
        getName = function(newName){//方法
            obj.user['name'] = newName;
        }
    }
    return obj;

    //or
    return {
         user: {},
         getName : function(newName) {
            user['name'] = newName;
         }
    };

    //or
    return {
        hasPermission: function(permission) {
           if (permission) {
              if (typeof permission == "string") {
                 if (permissionList.indexOf(permission) > -1) {
                    return true;
                 }
              }
           }
           return false;
       }
    };
}]);

2. service()
service()通过构造函数的方式让我们创建service,由于service是通过构造函数的方式创造的,且持有创造对象本身,所以当我们在功能比较复杂的情况下,可以通过service()中的方法和数据对controller中变量进行赋值。

var app = angular.module('mainApp',[]);
app.service('service2',["$rootScope",function($rootScope) {
    return {
        list : function( params ){
            console.log(params);
            //todo
            return params;
        },
        save: function (formData) {
            var promise = a;
            return promise;
        }
    }
}]);

3. provider
provider()是创建service最底层的方式,这也是唯一一个可以使用.config()方法配置创建service的方法
provider()不同于service()和factory(),在注入其他的服务的时候不能在function()中注入,即不能app.provider('service3',["$rootScope",function($rootScope) {}在function里注入$rootScope

var app = angular.module('mainApp',[]);
app.provider('service3',["$rootScope",function() {
    return {
        list: function($rootScope){//在这里注入

        }
    }
}]);
4. scope

scope(作用域):
是一个存储应用数据模型的对象,作为controller和view之间的粘结剂,为表达式提供了一个执行上下文。
作用域的层级结构对应于 DOM 树结构,一个angular应用有且仅有一个rootScope根作用域,作用域可以监听 表达式 的变化并传播事件。

<!DOCTYPE html>
<html>
<head>
</head>
<script src="script/angular.min.js"></script>

<script>
    var app = angular.module('scopeExample', [])
    app.controller('MyController', ['$scope', function($scope) {
        $scope.username = 'World';

        $scope.sayHello = function() {
             $scope.greeting = 'Hello ' + $scope.username + '!';
        };
    }]);
</script>
<body>
<div ng-app="scopeExample" ng-controller="MyController">
    Your name:
    <input type="text" ng-model="username">
    <button ng-click='sayHello()'>greet</button>
    <hr>
    {{greeting}}
</div>
</body>
</html>

更多详细参考angular中文网的教程。

5. filter

过滤器用来格式化表达式的值。如{{ 12 | currency }}格式化为$12.00。过滤器还可以带参数{{ expression | filter:argument1:argument2:... }}
在控制器或者服务中使用filter。控制器或者服务中添加以“<过滤器名>Filter”为名的依赖。例如,使用”numberFilter”为依赖时,会相应的注入number过滤器。
自定义过滤器
js代码

var app = angular.module('myReverseFilterApp', [])
app.filter('reverse',function(){
  return function(input, uppercase) {
    input = input || '';
    var out = '';
    for (var i = 0; i < input.length; i++) {
      out = input.charAt(i) + out;
    }
    if (uppercase) {
      out = out.toUpperCase();
    }
    return out;
  };
})
app.controller('MyController', ['$scope', 'reverseFilter', function($scope, reverseFilter) {
  $scope.greeting = 'hello';
  $scope.filteredGreeting = reverseFilter($scope.greeting);
}]);

页面

<!doctype html>
<html ng-app="MyReverseModule">
  <head>
    <script src="http://code.angularjs.org/1.2.25/angular.min.js"></script>
    <script src="script.js"></script>
  </head>
  <body>
    <div ng-controller="Ctrl">
      <input ng-model="greeting" type="text"><br>
      未添加过滤器: {{greeting}}<br>
      逆置: {{greeting|reverse}}<br>
      逆置 + 大写: {{greeting|reverse:true}}<br>
    </div>
  </body>
</html>
6. form

form 可以用来验证数据、保存提交数据

<form novalidate class="simple-form">
        Name: <input type="text" ng-model="user.name" /><br />
        E-mail: <input type="email" ng-model="user.email" /><br />
        Gender: <input type="radio" ng-model="user.gender" value="male" />male
        <input type="radio" ng-model="user.gender" value="female" />female<br />
        <button ng-click="reset()">RESET</button>
        <button ng-click="update(user)">SAVE</button>
      </form>

其中 novalidate 属性用于禁用浏览器自带的表单验证功能。
表单也可以用css的自定义样式。ngModel 增加了如下的CSS类: - ng-valid - ng-invalid - ng-pristine - ng-dirty

<form novalidate class="css-form">
     Name: <input type="text" ng-model="user.name" required /><br />
     邮箱: <input type="email" ng-model="user.email" name="email" required /><br />
     <span ng-show="form.email.$error.email">This is not a valid email.</span>
     <!--form.email中的email是表单元素的名称-->
     性别: 
     <label><input type="radio" ng-model="user.gender" value="male" /></label>
     <label><input type="radio" ng-model="user.gender" value="female" /></label><br />
    <button ng-click="reset()">重置</button>
    <button ng-click="update(user)">保存</button>
</form>

<style type="text/css">
    .css-form input.ng-invalid.ng-dirty {//input和ng-invalid之间没有空格。
        background-color: #FA787E;
    }

    .css-form input.ng-valid.ng-dirty {
        background-color: #78FA89;
    }
</style>

自定义验证

<div ng-controller="Controller">
      <form name="form" class="css-form" novalidate>
        <div>
          大小 (整数 0 - 10):
          <input type="number" ng-model="size" name="size"
                 min="0" max="10" integer /><br />
          <!--自定义integer指令-->
          <span ng-show="form.size.$error.integer">这是无效的数字!</span>
          <span ng-show="form.size.$error.min || form.size.$error.max">
            值必需在0到10之间!</span>
        </div>
      </form>
    </div>
var app = angular.module('form-example1', []);

var INTEGER_REGEXP = /^\-?\d+$/;
app.directive('integer', function() {
  return {
    require: 'ngModel',
    //link函数对自定义元素进行处理。添加事件什么的
    //link函数的4个参数固定,第二个参数是元素,第三个是元素上的属性
    link: function(scope, elm, attrs, ctrl) {
      ctrl.$parsers.unshift(function(viewValue) {
        if (INTEGER_REGEXP.test(viewValue)) {
          // 验证通过
          ctrl.$setValidity('integer', true);
          return viewValue;
        } else {
          // 验证不通过 返回 undefined (不会有模型更新)
          ctrl.$setValidity('integer', false);
          return undefined;
        }
      });
    }
  };
});
7. module

module可以当成一个容器,里面可以包含controller,service,directive等。
Hello World 的模块示例如下

<html ng-app="myApp">
  <head>
    <script src="http://code.angularjs.org/1.2.25/angular.min.js"></script>
    <script src="script.js"></script>
  </head>
  <body>
    <div>
      {{ 'World' | greet }}
    </div>
  </body>
</html>
var myAppModule = angular.module('myApp', []);
//通过创建一个过滤器模块,来达到模块的复用和模块化
myAppModule.filter('greet', function() {
 return function(name) {
    return 'Hello, ' + name + '!';
  };
});

模块加载和依赖
模块是配置代码块和运行代码块的集合

angular.module('myModule', []).
  config(function(injectables) { // provider型注入器
    // 这是配置(config)代码块的范例,你可以有任意多个配置代码块
    // 配置块中你只能注入Provider类(注意:不是由Provider类生成的实例)以及`constant`
  }).
  run(function(injectables) { // instance型注入器
    // 这是运行(run)代码块的范例,你可以有任意个运行代码块
    // 运行块中你只能注入Provider实例(注意:不是Provider类)
  });

配置代码块 如下

angular.module('myModule', []).
  value('a', 123).
  factory('a', function() { return 123; }).
  directive('directiveName', ...).
  filter('filterName', ...);

// 等同于

angular.module('myModule', []).
  config(function($provide, $compileProvider, $filterProvider) {
    $provide.value('a', 123);
    $provide.factory('a', function() { return 123; });
    $compileProvider.directive('directiveName', ...);
    $filterProvider.register('filterName', ...);
  });

执行代码块不清楚

使用angular.module("myModule",[])将创建一个名为myModule的模块并重写重名模块。使用angular.module("myModule")则只会获取已有的模块实例。

8. 路由

路由是angular的重要内容。首先需要引入route模块<script src="script/angular-route.min.js"></script>
在需要路由的地方使用ng-view。route路由里的定义的url 对应的html模板,会自动填充到ng-view里
。即项目里的那些html都只是一段div的原因,通常一个项目的主页面的body里会有ng-view标签。然后根据不同的url加载模板到这个标签里展示不同的页面。

route配置的示例

var app = angular.module("color", ["ngRoute"]);

app.config(function ($routeProvider) {
    $routeProvider
       .when("/index", {
            templateUrl: "index.html",
            controller: 'mainController'
       })
       .when("/list", {
            templateUrl: "list.html",
            controller: 'listController'
       })
       .when("/booklist", {
            templateUrl: "booklist.html",
            controller: 'booklistController'
       })              
       .otherwise('/');
});

先到这里。可以参考angular的中文网的教程http://www.angularjs.net.cn/tutorial/。以及慕课网的angular实战视频https://www.imooc.com/learn/156

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值