关于angularjs:angularjs-学习笔记

39次阅读

共计 11106 个字符,预计需要花费 28 分钟才能阅读完成。

  • angularjs 官网
  • Awesome AngularJS
  • angularjs 菜鸟学院
  • angular 中文网
  • angular 老手常常会碰到的坑

angularjs 外围性能介绍

  • 所有的货色都是绑在 module 下面的

    angular
        .module('app', [])  // module
        .factory()          // 工厂
        .service()          // 服务
        .controller()       // 控制器
        .directive()        // 指令
        .filter()           // 过滤器

angular 配置阶段

angular 过滤器

具体解释

能够通过过滤器来进行各种顺叙插入等操作

  • angular 自定义过滤器 demo
<!DOCTYPE html>
<html lang="en">

<head>
    <title>angular 自定义过滤器 demo</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body ng-app="myapp" ng-controller="my">
    <ul>
        <li ng-repeat="userLayer in userLayers | reverse" ng-bind="userLayer"></li>
    </ul>
</body>
<script src="https://cdn.bootcss.com/angular.js/1.5.3/angular.min.js"></script>
<script>
    angular.module('myapp', [])
        .controller('my', function($scope, $timeout) {$scope.userLayers = [1, 2, 3, 4, 5, 6, 8];
        })
        .filter('reverse', function() {return function(items) {return items.slice().reverse();}
        })
</script>

</html>

angular 罕用指令

angular 所有指令大全

  • ng-app 指令初始化一个 AngularJS 应用程序
  • ng-init 指令初始化应用程序数据
  • ng-bind 绑定 HTML 元素到应用程序数据
  • ng-model 双向绑定数据

ng-model 指令能够为利用数据提供状态值(invalid, dirty, touched, error)

<form ng-app=""name="myForm"ng-init="myText = 'test@runoob.com'">
    Email:
    <input type="email" name="myAddress" ng-model="myText" required></p>
    <h1> 状态 </h1>
    {{myForm.myAddress.$valid}}
    {{myForm.myAddress.$dirty}}
    {{myForm.myAddress.$touched}}
</form>
  • ng-repeatng-module 生效的时候能够应用 $parent 解决,作用域的问题
  • ng-repeat for 循环遍历数据

一些专有变量
$first 第一个
$last 最初一个
$middle 两头值
$index 索引号 从 0 开始

  • ng-repeat 的一些坑

如果和控制器一起写的话,就会呈现 $index 生效的问题
track by 肯定要放在 orderBy 之后,否则会影响 orderBy 的成果;
当繁多数组如 [“a”,”a”] 有反复元素时,须要应用 track by $index 来保障两个元素都会渲染,否则只会渲染一个

  • ng-repeat for 优化
<div ng-app=""ng-init="names=[{name:'Jani',country:'Norway'},
{name:'Hege',country:'Sweden'},
{name:'Kai',country:'Denmark'}]">
<p> 循环对象:</p>
<ul>
  <li ng-repeat="x in names">
    {{x.name + ',' + x.country}}
  </li>
</ul>
</div>
  • ng-showng-hide 显示或暗藏 HTML 元素
  • ng-switch api
  • ng-class-odd api
  • ng-class-even 个别用于隔行换色这种性能
  • ng-class
<ANY ng-switch="expression">
  <ANY ng-switch-when="matchValue1">...</ANY>
  <ANY ng-switch-when="matchValue2">...</ANY>
  <ANY ng-switch-default>...</ANY>
</ANY>
<!-- 作为属性 -->
<div ng-class="key === isShow ?'active':''"></div>
<!-- 作为 css 类 -->
<div class="ng-class:key === isShow ?'active':''"></div>
<!-- 另一种写法 -->
<div ng-class="{ture:'active', false:''}[isShow]"></div>
<!--key/value 的模式 -->
<!-- 如果 redStatus 和 greenStatus 的值都为真,则别离增加对应的 class,实用于增加多个 class -->
<div ng-class="{'red':redStatus,'green': greenStatus}"></div>
  • ng-controller 控制器
  • ng-controller 控制器的书写形式
// 惯例写法
app.controller('wolrdCtrl', function($scope, $http){// ...});

// 如果你心愿对 JS 进行压缩解决,那么参数名就可能发生变化,Angular Injector 将不可能正确地注入依赖的 Service。于是有另外一种写法
app.controller('wolrdCtrl', ['$scope', '$http', function($scope, $http){// ...}]);
<div ng-app="app" ng-controller='myCtrl'> {{myName}} </div>
angular.moduele('app', []).controller('myCtrl', function ($scope, $rootScope){
  $.scope.myName = '我的名字是 xxxx';
  // $rootScope  能够在多个控制器中应用
})
  • ng-include

    如果是要引入内部文件的话,那么 须要把这个门路变成一个字符串类型的,如下

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

angular 自定义指令

2017.7.14 试验发现,有时候模版外面的 ng-if 不失效,解决办法是把他放到调用的中央即可,原理未知

<div ng-app="angular" ng-controller="Controller">
  <div my-customer></div>
</div>
angular.module('angular', [])
    .controller('Controller', function($scope) {
        $scope.customer = {
            name: 'Naomi',
            address: '1600 Amphitheatre'
        };
    })
    .directive('myCustomer', function() {
        return {
            restrict : 'A',
            replace : true,
            templateUrl: 'my-customer.html'
        };
});
  • directive 罕用设置

官网 API
中文 API

(1) restrict

‘A’ – 仅匹配属性指令

    <!-- 属性指令 -->
    <div my-directive></div>

‘E’ – 仅匹配标签指令

    <!-- 标签指令 -->
    <my-directive></my-directive>

‘C’ – 只匹配类名指令

    <!-- 类名指令 -->
    <div class="my-directive"></div>

‘M’ – 只匹配正文指令

    <!-- 正文指令 -->
    <!-- directive:my-directive -->
    <div></div>

默认是 ‘AE’, 示意匹配属性或标签名, 能够依据须要进行拼接

(2) replace

true: 生成的 html 内容会替换掉定义此指令的 html
false: 生成的 html 内容会插入到定义此指令的元素中
默认值是 false

(3) transclude

容许在自定义指令内持续嵌套
在上面的例子中没有 tansclude 属性的话,hello 指令上面的别的标签就都被笼罩了

<body>
  <hello>
    <p>asdjlkfjaksdfjlsdajf</p>
    <div>
      123131321
    </div>
    <strong>54664456</strong>
  </hello>
</body>
<script>
  angular.module('angular', []).directive('hello', function() {
    return {
      replace: true,
      transclude: true,
      template: '<h1>hellow  angular <p ng-transclude></p> </h1>',
    }
  });
  angular.bootstrap(document, ['angular']);
</script>

(4) controller 外部的控制器,能够把办法裸露到内部,给内部应用

(5) scope 独立的作用域

让指令有本人的作用域

    angular.module('app', []).directive('hello', function (){
        return {scope: {}
        }
    })

(5.1) scope 的绑定策略

scope 能够取的值:
false 为默认,示意没有独立的作用域
true 示意有本人的独立作用域
@ 把以后的属性作为自字符串传递,还能够绑定来自外层的 scope 的值, 在属性之中插入{{}} 即可
= 与父元素的属性进行双向绑定
& 传递一个来自父 scope 的函数,稍后调用
@ 和 true 的区别 --

详解


<!-- demo1 -->

(6) link 对 dom 进行操作 官网 api 个别接管的参数

scope 控制器中的 $scope
element 将原始的 DOM 元素或 HTML 字符串包装为 jQuery 元素
反对 jquery 的办法有
留神:请留神,此函数不会通过标签名称 / CSS 选择器找到元素。对于由标签名称查找,尝试代替 或者,也能够应用规范的 DOM API,例如。angular.element(document).find(…)$document.find()document.querySelectorAll()
attr attrs 是具备标准化属性名称及其对应属性值

(6) compile 和 link 同时存在的时候,link 代码不执行

(8) require 指令于控制器的交互

(1)require 的值用?、^、或者?^ 润饰。
(2)如果不必任何润饰,则在以后指令中进行查找控制器。
(3)如果用 ^ 润饰,则在以后指令的父指令进行查找控制器,若未找到,则会抛出异样。
(4)如果用?润饰,则阐明在以后指令中未找到控制器,此时将以 null 作为第四个参数。
(5)如果须要交互多个指令,则以数组模式给出,如:1
鉴于此,为了不抛出异样,咱们个别以 ^?来进行润饰。

angular 罕用服务(函数) [能够自定义服务]

在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 利用中应用, 简略的说,就是 angular 自带的办法

  • 为啥肯定要应用这些服务

    在很多服务中,比方 $location 服务,它能够应用 DOM 中存在的对象,相似 window.location 对象,但 window.location 对象在 AngularJS 利用中有肯定的局限性。
    AngularJS 会始终监控利用,处理事件变动,AngularJS 应用 $location 服务比应用 window.location 对象更好

  • $location
$location.absUrl() // 获取以后页面的地址
  • [$http](https://docs.angularjs.org/api/ng/service/$http)
    angular 中 ajax 申请的办法阐明:/*
    * _http:angularJs 中的 $http 对象
    * _url:ajax 申请的 URL
    * _method: 申请形式:POST 或 GET
    * _params:GET 形式申请时传递的参数
    * _data:POST 形式申请时传递的参数
    * _responseType: 在申请中设置 XMLHttpRequestResponseType 属性,""(字符串,默认),
    * "arraybuffer"(ArrayBuffer);"blob"(blob 对象);"document"(HTTP 文档)"json"(从 JSON 对象解析而来的 JSON 字符串);* "text"(字符串);"moz-blob"(Firefox 的接管进度事件);"moz-chunked-text"(文本流);"moz-chunked-arraybuffer"(ArrayBuffer 流)。* 这个参数示意的含意就是服务器给页面返回的数据格式
    * _successCallback: 申请胜利的回调函数
    * _failureCallback: 申请失败的回调函数
    *
    */
//AngularJS1.5 以上版本的写法
$http({
    method: 'GET',
    url: 'angular_demo.html'
}).then(function successCallback(response){// 申请胜利执行的代码}, function errorCallback(response){// 申请失败执行的代码});
  • [$timeout](https://docs.angularjs.org/api/ngMock/service/$timeout)

$timeout.cancel(定时器的名字);

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $timeout) {
    $scope.myHeader = "Hello World!";
    $timeout(function () {$scope.myHeader = "How are you today?";}, 2000);
});
  • AngularJS scope 原理解析
  • AngularJS 事件流详解
  • $watch api

    $watch 监听 view 层 下面的某一个对象,当他的值产生扭转的时候触发绝对应的代码
    优化:开释多余的 watch: stopWatch()办法

  • $apply api

    $apply 把 module 层 的变动传到 view 层 下面去

  • $on api

    语法 => $on(name, listener);
    用于接管 event 与 data

  • $emmit api

    语法 => $emit(name, args);
    $emit 只能向 parent controller 传递 event 与 data

  • $broadcast api

    语法 => $broadcast(name, args);
    $broadcast 只能向 child controller 传递 event 与 data

  • 阻止事件冒泡 event.stopPropagation
  • angular 事件流详解 demo
<!DOCTYPE html>
<html lang="en">

<head>
    <title>angular 事件流解析 </title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body ng-app="app">
    <!-- 父级 -->
    <div ng-controller="ParentCtrl">
        <!-- 本人 -->
        <div ng-controller="SelfCtrl">
            <a ng-click="click()"> 点我点我点我 </a>
            <!-- 子级 -->
            <div ng-controller="ChildCtrl"></div>
        </div>
        <!-- 平级 -->
        <div ng-controller="BroCtrl"></div>
    </div>


<br>
    <div style="color:green;">
        点击实现之后,请在控制台查看相干信息;</div>
</body>

<script src="https://cdn.bootcss.com/angular.js/1.5.3/angular.min.js"></script>
<script>
    var app = angular.module('app', []);

    app.controller('SelfCtrl', function($scope) {$scope.click = function() {
            // 向 child controller 传递 event 与 data
            $scope.$broadcast('to-child', 'child');
            // 向 parent controller 传递 event 与 data
            $scope.$emit('to-parent', 'parent');
        }
    });

    app.controller('ParentCtrl', function($scope) {
        // 用于接管 event 与 data
        $scope.$on('to-parent', function(event, data) {
            // 父级能失去值
            console.log('我是 on 事件外面的货色哦 ParentCtrl', data);
        });

        $scope.$on('to-child', function(event, data) {
            // 子级得不到值
            console.log('ParentCtrl', data);
        });
    });

    app.controller('ChildCtrl', function($scope) {$scope.$on('to-child', function(event, data) {
            // 子级能失去值
            console.log('ChildCtrl', data);
        });
        $scope.$on('to-parent', function(event, data) {
            // 父级得不到值
            console.log('ChildCtrl', data);
        });
    });

    app.controller('BroCtrl', function($scope) {$scope.$on('to-parent', function(event, data) {
            // 平级得不到值
            console.log('BroCtrl', data);
        });
        $scope.$on('to-child', function(event, data) {
            // 平级得不到值
            console.log('BroCtrl', data);
        });
    });
</script>

</html>
  • [$interval](https://docs.angularjs.org/api/ng/service/$interval) 同 $timeout 的做法差不多

    勾销定时器 $timeout.cancel(timeName);

  • select angular select[也能够是用 ng-repeat 来进行 for 循环]
<div ng-app="myApp" ng-controller="myCtrl">
    <select ng-init="selectedName" ng-model="selectedName" ng-options="value for (key, value) in names">
    </select>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {$scope.names = ["Google", "Runoob", "Taobao"];
    $scope.selectdName = names[0];
});
</script>
  • tabel tabel 的相干应用

angular 罕用全局办法

  • angular 所有的办法
  • angular.lowercase() 转换字符串为小写
  • angular.uppercase() 转换字符串为大写
  • angular.isString() 判断是否是一个字符串,如果是则返回 true
  • angular.isNumber() 判断是否是一个数组,如果是则返回 false
  • angular.toJson() 把数组或者对象变成字符串
  • angular.fromJson() 把字符串变成对象
  • angular.isNumber() 判断是否是一个数组,如果是则返回 false
  • angular.element($(element) || ‘js 原生获取元素办法 ’) 判断是否是一个数组,如果是则返回 false
angular.module('', []).controller('', function ($scope){
    $scope.name = 'string';
    $scope.name = angular.lowercase($scope.name); // 把以后字符串转换为小写
})
  • angular.bootstrap 手动启动 AngularJS 程序

    官网 API
    angular.bootstrap(element, [modules], [config]);
    其中第一个参数 element: 是绑定 ng-app 的 dom 元素;
    modules:绑定的模块名字
    config:附加的配置

  • angular service service 外面是不能间接注入 $scope 的
    // 定义一个 service, 依照 api 的说法,service 的第二个参数放的是一个构造函数,当 angular 调用 service 的时候会本人去实例化它
    angular.module('app', []).service('getName', GetName).controller('myCtrl', function($scope, getName){getName.showName();//ben
    })

    function GetName (){this.name = "ben"}

    GetName.prototype.showName = fuunction (){console.log(this.name)
    }
  • angular factory

    // 定义一个 factory,
     angular.module('app', []).factory('getName', function (getName){
         var getName = {showName: function () {alert(1);
                 }
             }
             return getName;
     })

Service 和 Factory 等的区别

stack_overflow 的答复

angular 依赖注入

angular 路由

  • __ngRouter 和 ui-router__的区别

具体攻略

  • ui-view 的三种调用形式
  • angular 应用 iframe 报错解决方案

计划 1

(1) <ui-view></ui-view>
(2) <div ui-view></div>
(3) <div class=”ui-view”></div>

  • ui-router 的一些应用

    官网 API

angular ui-router 通过 url 传值的办法:

 $scope.toDiy = function(item) {// 实用于 两个我的项目中进行切换应用,如果是一个我的项目之间切换请应用 $state.go(xx);
            window.location.href = window.location.pathname + '?item=' + item +'#/shop/classifiedList';
        }


    // ui-router 带值传输
    // module-config 中的配置
    $state('shop.xx', {url:'/classifiedList/:id/:book',})
    // 之后在控制器中设置
    $state.go('shop.classifiedList', {id:id, book:'xx'})
<!doctype html>
<html ng-app="myApp">
<head>
  <script src="js/angular.js"></script>
  <!-- Include the ui-router script -->
  <script src="js/angular-ui-router.min.js"></script>
  <script>
    // ...and add 'ui.router' as a dependency
    var myApp = angular.module('myApp', ['ui.router']).config(function ($stateProvider, $urlRouterProvider){
        $stateProvider
        .state('box', {
            url: '/box', // 父路由, 门路调用的模式  #/box
            templateUrl: 'example.html',
            controller: 'myCtrl', // 这里能够放一个控制器的名称或者是一个办法
        })
        .state('box.children', {
            url: '/children',
            templateUrl: 'children.html', // 子路由,门路调用的模式  #/box/children
            controller: 'childrenCtrl'
        })
    });
  </script>
</head>
<body>
</body>
</html>
  • $cacheFactory 具体阐明
    堆栈溢出的解释

如果您有一个申请检索常量数据,例如城市列表。每次用户进入他必须抉择城市的表单时,从服务器获取此列表并不是一个好的模式!所以你必须缓存这个列表。cacheFactory 是为此实现的!
值的留神的是,这是应用程序的缓存服务,而不是浏览器本地的缓存。所以当你刷新浏览器,初始化整个应用程序的时候,之前的缓存数据都会失落。那么问题就来了,怎么能力刷新 / 初始化应用程序而不失落之前保留的数据呢,这个能够应用 localStorage 或者 cookies

  • angular.extend

angular.extend(DST, SRC) 顺次将第二个参数及后续的参数的第一层属性(不论是简略属性还是对象)拷贝赋给第一个参数的第一层属性,即如果是对象,则是援用的是同一个对象,并返回第一个参数对象

  • $q, defer, promise
    具体解释
    另一个版本
  • angular.fromJson

    angular.fromJson({a:’11’, b:’cc’}) ==> Object {a: “11”, b: “cc”}

  • angular.toJson

    angular.toJson({a:’11’, b:’cc’}) ==> “{“a”:”11″,”b”:”cc”}”

angualr 入坑不齐全指南

  • (1) ui.router 和 angular 一起被 require 援用的时候,会报错

起因解析
required 原理引入机制没有具体钻研,起因就是 router 必须在 angular 框架之后引入
解决办法
独自先引入 angular 解决问题


  1. ?a,^?b ↩

正文完
 0