AngularJs 基础(60分钟入门)

AngularJs是一个不错的用于开发SPA应用(单页Web应用)的框架。单页Web应用(single page web application,SPA),就是只有一张Web页面的应用。浏览器一开始会加载必需的HTML、CSS和JavaScript,所有的操作都在这张页面上完成,由JavaScript来控制不同view在这个页面上的呈现。本文源于Youtube上一个不错的AngularJs的入门教程视频:AngularJS Fundamentals In 60-ish Minutes,主要讲解了AngularJs中Directive,Data Binding,Filter和Module的概念和用法。个人认为这四个概念是AngularJs的核心,支撑起了AngularJs的骨架。掌握了他们对全局上把握AngularJs很有帮助。进阶则需要大量实践和官网API文档的阅读。

看看下图大致就可以了解AngularJs有何能耐。

首先从官网下载angular.min.js和angular-route.min.js。 可以从官网下载(https://angularjs.org/或https://code.angularjs.org/)

在VS中创建一个空的Empty Web项目。

Directive 和 Data Binding

AngularJs 中的Directive概念不是很容易理解,入门阶段可暂且将其理解为用来扩展HTML的一种tag. Angularjs会解析这些tag,以实现Angularjs的Magic.

下面代码使用了两个Directive:ng-app 和 ng-model.

ng-app: 用于auto-bootstrap 一个AngularJs应用。这是必须的一个Directive,一般加在HTML的根对象上(如下代码所示)。更详细解释,移步官网:https://docs.angularjs.org/api/ng/directive/ngApp

ngModel: 用于在property和HTML控件(input,select, textarea)之间建立双向的Data Binding,也就是说HTML控件的值改变会反应到property上,反过来也同样成立。property就是通过{{}}创建的一个对象。

下面代码展示了将文本控件和name之间建立了Data Binding.

<!DOCTYPE html>
<html ng-app>
<head>
    <title>Using Directives and Data Binding Syntax</title>
</head>
<body>
    <div class="container">
        Name: <input type="text" ng-model="name" /> {{name}}
    </div>
    <script src="angular.min.js"></script>
</body>
</html>

Directive可以用“x-”或者“data-”作为前缀。Directive可以放置于元素名、属性、class、注释中。

<!DOCTYPE html>
<html data-ng-app="">
<head>
    <title>Using Directives and Data Binding Syntax</title>
</head>
<body>
    <div class="container">
        Name: <input type="text" data-ng-model="name" /> {{name}}
    </div>
    <script src="angular.min.js"></script>
</body>
</html>

下面是HTML运行以后的结果。

下面例子展示了通过ng-init和ng-repeat来遍历操作一个数组的用法。

<!DOCTYPE html>
<html data-ng-app="">
<head>
    <title>Iterating with the ng-repeat Directive</title>
</head>
<body>
    <div class="container" data-ng-init="names = [‘Terry‘,‘William‘,‘Robert‘,‘Henry‘]">
        <h3>Looping with the ng-repeat Directive</h3>
        <ul>
            <li data-ng-repeat="name in names">{{name}}</li>
        </ul>
    </div>
    <script src="angular.min.js"></script>
</body>
</html>

更多directve的用法,参考官网https://docs.angularjs.org/api

Filter

作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。主要用于对数组过滤,对数组中的元素进行排序, 对数据做格式化处理等。

AngualrJS内置了一些过滤器,它们是:currency(货币)、date(日期)、filter(子串匹配)、json(格式化json对象)、limitTo(限制个数)、lowercase(小写)、uppercase(大写)、number(数字)、orderBy(排序)。总共九种。除此之外还可以自定义过滤器,这个就强大了,可以满足任何要求的数据处理。

下面代码展示了数据过滤,排序和大小写转换的实现。每个Filter跟在数据后,并有|隔开。

<!DOCTYPE html>
<html data-ng-app="">
<head>
    <title>Using Filter</title>
</head>
<body>
    <div class="container" data-ng-init="customers = [{name:‘Terry Wu‘,city:‘Phoenix‘},
         {name:‘Terry Song‘,city:‘NewYork‘},{name:‘Terry Dow‘,city:‘NewYork‘},
         {name:‘Henry Dow‘,city:‘NewYork‘}]">
        Names:
        <br />
        <input type="text" data-ng-model="name" />
        <br />
        <ul>
            <li data-ng-repeat="cust in customers | filter:name | orderBy:‘city‘">{{cust.name | uppercase}} - {{cust.city | lowercase}}</li>
        </ul>
    </div>
    <script src="angular.min.js"></script>
</body>
</html>

运行的结果:

Module

Module就是一个容器,用于管理一个AngularJS应用的各个部分,是AngularJS中很重要的概念。一个AngularJS应用就是一个Module,其作用和C#应用程序中Assembly作用类似。C#中我们通过main函数来bootstrap应用程序。而AngularJS则通过na-app="moduleName"的方式来bootstrap一个AngularJS应用。moduleName就是Module对象的name.

下图是一个Module有哪些常见部分组成。
Config/Route:用于配置AngularJS应用的路由(AngularJS),作用类似于ASP.NET MVC应用中的Config/Route。
Filter:对数据起过滤作用,上文有解释。
Directive: 扩展HTML,AngularJS中最重要的概念。没有Directive就没有AngularJS。
Controller: 作用类似于ASP.NET MVC应用中的Controller。页面逻辑就在Controller中实现,通过controller可以对model进行操作。 AngularJS则通过内建的Data-Binding机制将model绑定到view(HTML控件)
Factory/Service/Provider/Value: 提供对数据源的访问。比如Restful API就是常见的数据源。 Controller通过Factory/Service/Provider/Value访问数据源完成数据的CRUD操作。

下面这段代码实现了上面实例的相同的功能,差异就在于这个实例通过创建一个module(angularJS应用),并在module下添加contorller来实现上面的功能。在SimpleController(Controller)中,我们创建了customers(Model)并进行数据初始化, View(Html控件)则直接绑定到customers(Model)。$Scope是一个AngualrJS中所有viewModule的容器对象。Controller需要通过$Scope来访问viewModule。

这个例子比上面例子更接近实际工程中的用法。

<!DOCTYPE html>
<html data-ng-app="demoApp">
<head>
    <title>Using  module Controller</title>
</head>
<body>
    <div data-ng-controller="SimpleController">
        Names:
        <br />
        <input type="text" data-ng-model="name" />
        <br />
        <ul>
            <li data-ng-repeat="cust in customers | filter:name | orderBy:‘city‘">{{cust.name | uppercase}} - {{cust.city | lowercase}}</li>
        </ul>
    </div>

    <script src="angular.min.js"></script>

    <script>
        var demoApp = angular.module("demoApp", []);

        demoApp.controller("SimpleController", function ($scope) {
            $scope.customers = [
                { name: ‘Terry Wu‘, city: ‘Phoenix‘ },
                { name: ‘Terry Song‘, city: ‘NewYork‘ },
                { name: ‘Terry Dow‘, city: ‘NewYork‘ },
                { name: ‘Henry Dow‘, city: ‘NewYork‘ }
            ];
        });
    </script>
</body>

</html>

<!DOCTYPE html>
<html data-ng-app="demoApp">
<head>
    <title>Using Controller</title>
</head>
<body>
    <div data-ng-controller="SimpleController">
        Names:
        <br />
        <input type="text" data-ng-model="name" />
        <br />
        <ul>
            <li data-ng-repeat="cust in customers | filter:name | orderBy:‘city‘">{{cust.name | uppercase}} - {{cust.city | lowercase}}</li>
        </ul>
    </div>

    <script src="angular.min.js"></script>

    <script>
        var demoApp = angular.module("demoApp", []);

        var controllers = {};
        controllers.SimpleController = function ($scope) {
            $scope.customers = [
                { name: ‘Terry Wu‘, city: ‘Phoenix‘ },
                { name: ‘Terry Song‘, city: ‘NewYork‘ },
                { name: ‘Terry Dow‘, city: ‘NewYork‘ },
                { name: ‘Henry Dow‘, city: ‘NewYork‘ }
            ];
        }

        demoApp.controller(controllers);
    </script>
</body>

</html>

<!DOCTYPE html>
<html data-ng-app="demoApp">
<head>
    <title>Using Controller</title>
</head>
<body>
    <div>
        <div data-ng-view=""></div>
    </div>

    <script src="angular.min.js"></script>
    <script src="angular-route.min.js"></script>

    <script>
        var demoApp = angular.module(‘demoApp‘, [‘ngRoute‘]);

        demoApp.config(function ($routeProvider) {
            $routeProvider
                .when(‘/‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View1.html‘
                })
                .when(‘/view2‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View2.html‘
                })
                .otherwise({redirectTo:‘/‘});
        });

        var controllers = {};
        controllers.SimpleController = function ($scope) {
            $scope.customers = [
                { name: ‘Terry Wu‘, city: ‘Phoenix‘ },
                { name: ‘Terry Song‘, city: ‘NewYork‘ },
                { name: ‘Terry Dow‘, city: ‘NewYork‘ },
                { name: ‘Henry Dow‘, city: ‘NewYork‘ }
            ];

            $scope.addCustomer = function () {
                $scope.customers.push({ name: $scope.newCustomer.name, city: $scope.newCustomer.city });
            };
        }

        demoApp.controller(controllers);
    </script>
</body>

</html>

下图展示了Module及其各个组成部分的关系。

下面实例通过config配置module的route实现一个SPA实例。首先创建View1.html 和View2.html。 目录结构如下图.

<div>
    <h2>View1</h2>
    Names:
    <br />
    <input type="text" data-ng-model="filter.name" />
    <br />
    <ul>
        <li data-ng-repeat="cust in customers | filter:filter.name | orderBy:‘city‘">{{cust.name | uppercase}} - {{cust.city | lowercase}}</li>
    </ul>

    <br />
    Customer Names:<br />
    <input type="text" data-ng-model="newCustomer.name" />
    <br />
    Customer City:<br />
    <input type="text" data-ng-model="newCustomer.city" />
    <br />
    <button data-ng-click="addCustomer()">Add Customer </button>
    <br />
    <a href="#/view2">View 2</a>
</div>

View1.html

<div>
    <h2>View2</h2>
    City:
    <br />
    <input type="text" data-ng-model="city" />
    <br />
    <ul>
        <li data-ng-repeat="cust in customers | filter:city | orderBy:‘city‘">{{cust.name | uppercase}} - {{cust.city | lowercase}}</li>
    </ul>
</div>

View2.html

通过$routeProvider来配置当前页面中view1 和view2 的路由,已经每个view所对应的controller。 view1和view2会显示在当前页面标注了ng-view的位置。

同时通过config我们解耦了controller和HTML标签。 上面的例子,我们需要给html标签添加ng-controller tag来使用controller。这边直接通过config完成这样的配置。

<!DOCTYPE html>
<html data-ng-app="demoApp">
<head>
    <title>View</title>
</head>
<body>
    <div>
        <div data-ng-view=""></div>
    </div>

    <script src="angular.min.js"></script>
    <script src="angular-route.min.js"></script>

    <script>
        var demoApp = angular.module(‘demoApp‘, [‘ngRoute‘]);

        demoApp.config(function ($routeProvider) {
            $routeProvider
                .when(‘/‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View1.html‘
                })
                .when(‘/view2‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View2.html‘
                })
                .otherwise({redirectTo:‘/‘});
        });

        var controllers = {};
        controllers.SimpleController = function ($scope) {
            $scope.customers = [
                { name: ‘Terry Wu‘, city: ‘Phoenix‘ },
                { name: ‘Terry Song‘, city: ‘NewYork‘ },
                { name: ‘Terry Dow‘, city: ‘NewYork‘ },
                { name: ‘Henry Dow‘, city: ‘NewYork‘ }
            ];

            $scope.addCustomer = function () {
                $scope.customers.push({ name: $scope.newCustomer.name, city: $scope.newCustomer.city });
            };
        }

        demoApp.controller(controllers);
    </script>
</body>

</html>

效果如下图。

最后一个实例更接近实际工程中的用法,我们引入了Factory来初始化数据(实际工程中,在这里可访问webAPI获取数据完成初始化),Controller中则通过Factory获得数据。

<!DOCTYPE html>
<html data-ng-app="demoApp">
<head>
    <title>Using Factory</title>
</head>
<body>
    <div>
        <div data-ng-view=""></div>
    </div>

    <script src="angular.min.js"></script>
    <script src="angular-route.min.js"></script>

    <script>
        var demoApp = angular.module(‘demoApp‘, [‘ngRoute‘]);

        demoApp.config(function ($routeProvider) {
            $routeProvider
                .when(‘/‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View1.html‘
                })
                .when(‘/view2‘,
                {
                    controller: ‘SimpleController‘,
                    templateUrl: ‘Partials/View2.html‘
                })
                .otherwise({ redirectTo: ‘/‘ });
        });

        demoApp.factory(‘simpleFactory‘, function () {
            var customers = [
                { name: ‘Terry Wu‘, city: ‘Phoenix‘ },
                { name: ‘Terry Song‘, city: ‘NewYork‘ },
                { name: ‘Terry Dow‘, city: ‘NewYork‘ },
                { name: ‘Henry Dow‘, city: ‘NewYork‘ }
            ];

            var factory = {};

            factory.getCustomers = function ()
            {
                return customers;
            }

            return factory;
        });

        var controllers = {};
        controllers.SimpleController = function ($scope, simpleFactory) {
            $scope.customers = [];

            init();

            function init() {
                $scope.customers = simpleFactory.getCustomers();
            }

            $scope.addCustomer = function () {
                $scope.customers.push({ name: $scope.newCustomer.name, city: $scope.newCustomer.city });
            };
        }

        demoApp.controller(controllers);
    </script>
</body>

</html>
时间: 2024-08-29 00:57:02

AngularJs 基础(60分钟入门)的相关文章

C++ 60分钟入门教程.从入门到精通

C++是一门面向对象的程序设计语言,语法丰富,概念全面,兼顾易用和效率,在游戏开发.网络软件.分布式(服务器集群).移动(手持)设备.嵌入式系统等领域有着广泛的应用.C++是由C语言发展而来,保留了C语言原有的所有优点,增加了面向对象的机制.C++与C语言兼容,用C语言写的程序基本上可以不加修改地用于C++. 如果你有C语言和面向对象编程基础,可以先查看C++快速入门教程,在最短的时间内了解C++与C语言的区别,以及新增概念,请猛击:C++ 60分钟入门教程 与快速入门教程相比,下面的C++教程

iOS开发60分钟入门

iOS开发60分钟入门 原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于了解如何开始开发iOS App,学习目标包括: 能使用Xcode IDE.模拟器 能修改.调试已有iOS App 能在已有应用内创建新模块 能创建新应用 能发布应用到App Store 本文不包含任何高级的iOS开发知识,已学会iOS开发的同学不要看,

AngularJs 基础(60分钟入门) (转)

AngularJs是一个不错的用于开发SPA应用(单页Web应用)的框架.单页Web应用(single page web application,SPA),就是只有一张Web页面的应用.浏览器一开始会加载必需的HTML.CSS和JavaScript,所有的操作都在这张页面上完成,由JavaScript来控制不同view在这个页面上的呈现.本文源于Youtube上一个不错的AngularJs的入门教程视频:AngularJS Fundamentals In 60-ish Minutes,主要讲解了

0基础一分钟入门Python

这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python官方网站下载:https://www.python.org/downloads/ 1.2 百度网盘下载:https://pan.baidu.com/s/1PV-hQb-GQMPjY0vWjg2dow 密码:lt09 1.3 五角星实例代码:https://pan.baidu.com/s/1QrXeM

深入浅出lambda表达式--零基础一分钟入门

lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如: public static void main(String[] args) { PlatformQuery query = new PlatformQuery().createDemo(); Runnable c = () -> { System.out.println(JsonUtils.toJson(query)); }; Thread thread = new Thread(c); thread.

PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程

什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 开始学习 Tensors (张量) Tensors 类似于 NumPy 的 ndarrays ,同时  Tensors 可以使用 GPU 进行计算. from future import print_function import torch 构造一个5x3矩阵,不初始化. x = torch.em

[PyTorch入门之60分钟入门闪击战]之训练分类器

训练分类器 目前为止,你已经知道如何定义神经网络.计算损失和更新网络的权重.现在你可能在想,那数据呢? What about data? 通常,当你需要处理图像.文本.音频或者视频数据时,你可以使用标准Python包来将数据导入到numpy 数组中.然后再将数组转换成torch.Tensor. 对于图像,可用的包有:Pillow.OpenCV 对于音频,可用的包有:scipy和librosa 对于文本,无论是基于原始的Python或Cython的加载,或是NLTK和SpaCy都是可以的. 对于视

[PyTorch入门之60分钟入门闪击战]之神经网络

神经网络 来源于这里. 神经网络可以使用torch.nn包构建. 现在你对autograd已经有了初步的了解,nn依赖于autograd定义模型并区分它们.一个nn.Module包含了层(layers),和一个用来返回output的方法forward(input). 以下面这个区分数字图像的网络为例: 上图是一个简单的前馈网络.它接受输入,一个层接一层地通过几层网络,最后给出输出. 典型的神经网络训练程序如下: 定义具有一些可学习参数(或权重)的神经网络 迭代输入的数据集 通过网络处理输入 计算

转: Vue.js——60分钟组件快速入门(上篇)

转自: http://www.cnblogs.com/keepfool/p/5625583.html Vue.js——60分钟组件快速入门(上篇) 组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HTML元素,封装可重用的HTML代码,我们可以将组件看作自定义的HTML元素. 本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或