Angular(一)

AngularJS简介

AngularJS是一个JavaScript框架,它通过指令扩展了HTML,通过表达式绑定数据到HTML,由此使得开发现代的单一页面应用程序变得更加容易

  • 可以把应用程序数据绑定到HTML元素。
  • 可以克隆和重复HTML元素。
  • 可以隐藏和显示HTML元素。
  • 可以在HTML元素"背后"添加代码。
  • 支持输入验证。

MVC与MVVM

MVC(Model-View-Controller)

MVC是将Model, View和Controller分离,让彼此的职责明确的分开,这样不论是改M, V还是C,都可以确保另外两层可不用做任何修改,同时这样的分层也可以加强程式的可测试性,View和Model基本上是相关的,但它们并不会有直接的相依关系,而是由Controller去决定Model产生的资料,然后丢给View去做呈现,也就是说,Controller是Model和View之间的协调者,View和Model不能直接沟通,以确保责任的分离。

单向数据绑定,用户改变视图(表单元素),更改后会触发控制器,获取数据后,在刷新视图:

enter image description here

单向绑定的优点是相应的可以带来单向数据流,这样做的好处是所有状态变化都可以被记录、跟踪,状态变化通过手动调用通知,源头易追溯。同时组件数据只有唯一的入口和出口,使得程序更直观更容易理解,有利于应用的可维护性。缺点则是代码量会相应的上升,数据的流转过程变长。

MVVM(Model-View-ViewModel)

MVVM的架构一样是M, V分离,但中间是以VM (ViewModel)来串接,ViewModel负责直接对Model做沟通,而View可以透过一些机制来和ViewModel沟通以取得资料或将资料抛给Model做存取等工作。

双向数据绑定,页面变化(表单元素),会触发数据的变化,数据的变化,会更改页面的变化:

enter image description here

双向绑定优点是在表单交互较多的场景下,会简化大量业务无关的代码。缺点就是我们无法追踪局部状态的变化(虽然大部分情况下我们并不关心),潜在的行为太多也增加了出错时 debug 的难度。同时由于组件数据变化来源入口变得可能不止一个,新手玩家很容易将数据流转方向弄得紊乱,如果再缺乏一些“管制”手段,最后就很容易因为一处错误操作造成应用雪崩。

Angular安装

  • 全局安装:
npm install babel -g 
npm install bower -g 
  • 本地安装:
npm install jquery
npm install angular
  • 安装前项目需初始化生成package.json文件
npm init -y

npm是基于node,安装node后会直接安装npm,安装模块到node_modules文件夹下,如果当前没有会像上一级找
默认安装angular1.0,市面1.5.8

AngularJS 指令

AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-

  • ng-app 指令初始化一个 AngularJS 应用程序,定义了 AngularJS 应用程序的根元素。

  • ng-bind 绑定 HTML 元素到应用程序数据,和{{ }}作用一致,可以解决闪烁单行问题。

  • ng-model 指令把元素值(比如输入域的值)绑定到应用程序,实现双向数据绑定,放在表单元素上。

    • ng-model 指令也可以:
    • 为应用程序数据提供类型验证(number、email、required)。
    • 为应用程序数据提供状态(invalid、dirty、touched、error)。
    • 为 HTML 元素提供 CSS 类。
    • 绑定 HTML 元素到 HTML 表单。
  • ng-repeat 可以遍历数组或对象,遍历在谁,写在谁的身上,指令对于集合中(数组中)的每个项会 克隆一次 HTML 元素。

  • ng-controller 会产生一个作用域,作用范围和DOM平齐,可以嵌套控制器,子可以继承父亲。

  • ng-cloak 解决多行闪烁问题,需加上样式:[ng-cloak]{display:none}

  • ng-事件 (-ng-click...)通过ng-事件来执行作用域上的方法,如果需要事件源,需要手动传递$event对象

Angular简单购物车功能示例代码:

<!doctype html>
<html lang="en" ng-app="appModule">
<!--初始化一个 AngularJS 应用程序,在整个html元素为angular根元素-->
<head>
    <meta charset="UTF-8">
    <title>简单购物车功能示例</title>
</head>
<body>
<div ng-controller="myCtrl"><!--产生一个作用域,在当前div下有效-->
    <ul>
        <li ng-repeat="(key,product) in products track by $index">
           <!--key为索引,product为索引对应项,可以只写一项:product in products-->
           <!--track by $index表示通过索引遍历,性能更好,同时不会因值相同产生错误-->

            {{product.name}}<!--双大括号绑定数据-->
            <button ng-click="remove(product)">删除</button><!--绑定remove函数,必须加括号,需要传事件源则加$event-->
        </li>
    </ul>
</div>
<script src="node_modules/angular/angular.js"></script>
<script>
    var app = angular.module('appModule',[]);//声明模块,app代表的是当前模块
    
    app.controller('myCtrl',['$scope',function ($scope) {
        //1.控制器的名字 2.控制器的一个定义 $scope 即 viewModel
        //因传参规定必须为$scope,为了防止压缩改变 采用数组的形式
        
        //运用localStorage本地存储数据
        if(localStorage.getItem('products')){
            //先获取本地内容,如果有
            $scope.products = JSON.parse(localStorage.getItem('products'));
        }else{
            $scope.products = [
                {name:'冰箱'},
                {name:'电脑'},
                {name:'电视'},
            ];
            localStorage.setItem('products',JSON.stringify($scope.products));
        }
        $scope.remove = function (p) { //filter过滤,如果遇到不想要的返回false即可,返回新数组
            $scope.products = $scope.products.filter(function (item) {
                return  item != p;//返回false表示当前项移除掉
            });
            localStorage.setItem('products',JSON.stringify($scope.products));
        };
    }]);
</script>
</body>
</html>

Angular过滤器

内置过滤器:

大小写:

{{"asdasd" | uppercase}} 
{{"AASDASD"| lowercase}}

货币过滤器 默认在最前面增加$符号:

{{"123123.123"| currency:'¥':3}}

限制过滤器:

{{"你好吗" | limitTo:2}}

json过滤器:

<pre>{{ {name:1,age:4} | json:4 }}

number过滤器:

{{123123|number}}

日期过滤器:

{{1489568089171 | date:"yyyy年MM月 hh:mm:ss"}}

自定义过滤器:

<body>
{{"hello" | capitalized}}
<!--实现首字母大写-->
<script src="node_modules/angular/angular.js"></script>
<script>
    var app = angular.module('appModule',[]);
    app.filter('capitalized',function () {
       return function (input,param1) {//1.param1代表的是要过滤的数据
           //取出除了第一个的所有的参数的集合[]
           //console.log([].slice.call(arguments,1));
           //console.log(Array.from(arguments).slice(1));//类数组转换成数组
           //console.log(o);//...o
           return input;//最终显示到页面上的数据
       }
    });
</script>
</body>

es5,es6方法

filter数组的方法
"删除"过滤,返回是一个新的数组
push,pop,unshift,shift,slice,splice,concat,forEach,join,map,sort,indexof,reverse,lastIndexOf,every,some

var newArr = [].filter(function(item,index){
    return true保留这一项/false这项不要了
},this指向);

map数组的方法
"修改"映射,返回是一个新的数组

var newArr = [1,2,3,2,2,2].map(function (item,index) {
    return `<li>${item}</li>`;//返回什么内容,就会将这一项变成什么内容
});
console.log(newArr);

find数组的方法
"查找"es6,找到后不会继续查找,返回找到的那一项

var arr = [{name:1,age:2},{name:2,age:3},{name:2,age:3,gender:1}];
var obj = arr.find(function (item,index) {
    return item.name == 2;//如果找到返回true即可,会将item返回回去,不会继续执行
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,580评论 0 3
  • ng-model 指令ng-model 指令 绑定 HTML 元素 到应用程序数据。ng-model 指令也可以:...
    壬万er阅读 857评论 0 2
  • AngularJS简介:AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,...
    程序员米粉阅读 48,435评论 32 117
  • Angular JS 是一个JavaScript框架。他可以通过 标签添加到HTML页面。他是通过指令扩展了HTM...
    郭豪豪阅读 417评论 0 0
  • 没遇见你之前,我人生三分之一的时间在睡觉。遇见你之后,我愿意把所有时间拿来与你浪费。
    不与人知阅读 143评论 0 0