前端架构一个程序员

一个例子 - 入门AngularJS

2017-04-06  本文已影响0人  Jason_Zeng

一. 为什么要使用AngularJS

Angular.js 是一个MVW(Model-View-Whatever,不管是MVC或者MVVM,统归MDV(model Drive View))JavaScript框架,个人更觉得像MVVM框架, 其是Google推出的专门用于SPA(single-page-application)应用框架.

Silverlight中的MVVM(Model-ViewModel-View), 基于数据绑定的设计模式


  1. Model层: 一个简单学生实体模型
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime Date { get; set; }
}
  1. ViewModel层: 通过继承INotifyPropertyChanged实现数据更新自动通知变化的数据绑定
public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
public class ViewModel : ViewModelBase
{
    public ViewModel()
    {
         Student = new Student();
         Student.Date = DateTime.Today.Date;
         Student.Name = "Jason";
         Student.Age = 18;
    }
    private Student _student;
    public Student Student
    {
        get
        {
            return _student;
        }
        set
        {
            _student = value;
            NotifyPropertyChanged("Student");
        }
    }
}
  1. View层(伪代码): 通过Binding写法绑定ViewModel中的数据, 同时可以配置绑定方式
<TextBox Text="{Binding Student.Name, Mode=OneWay}"/>
<TextBox Text="{Binding Student.Age, Mode=TwoWay}"/>
<TextBox Text="{Binding Student.Date, Mode=OneTime}"/>
  1. 参考: A Simple Silverlight Application Implementing MVVM

AngularJs中的MVW(Model-View-Whatever),个人理解为MVVM


  1. 示例代码
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<!----------------------引入AngularJs的包------------------------->
<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
<body ng-app="myApp" >
    <!------------------------View层------------------------------>
    <div ng-controller="myCtrl">
        姓名:  <input type="text" ng-model="student.name"><br>
        年龄:  <input type="text" ng-model="student.age"><br>
        入学时间:  <input type="text" ng-model="student.date"><br>
        
        <br>
        学生信息: {{student.name + " " + student.age +" " + student.date}}
    </div>
    <!------------------------View层------------------------------>
    
    <!-------ViewModel层($scope) / Controller层(controller)------->
    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            //---------------Model层: student--------------//
            $scope.student = {
                name: "Jason",
                age: 17,
                date: "2015-04-01"
            };
            //---------------Model层: student--------------//
        });
    </script>
    <!-------ViewModel层($scope) / Controller层(controller)------->
</body>
</html>
  1. talk is cheap, show me the demo, try it yourself

  2. MVVM模式图

    image

二. 如何开始学习AngularJS

  1. 从示例中了解AngularJS的基本概念
    1. 引用AngularJS包

      <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
      
    2. 启动AngularJS(ng-app):首先要告诉AngularJS我们的应用运行在DOM结构的哪一部分,我们可以把==指令ng-app==设在任何DOM元素上,然后该元素就会成为AngularJS启动运行我们应用的地方, 示例中 <body ng-app="myApp"></body> 告诉AngularJS拥有<body>下面的DOM区域并且从这里开始启动, 注意有且只能有一个地方标注ng-app.

      <body ng-app="myApp">
          // ... ...
      </body>
      
    3. 创建模块(Module): 注意到在上面ng-app="myApp"中myApp, 其实在AngularJS启动的时候有个启动器, 如果ng-app不带属性值,启动器就会自动初始化(默认配置)应用程序, 但是有属性值, 比如我们的myApp, 这代表告诉AngularJS要加载叫做myApp的模块作为初始化程序,所谓AngularJS模块,其实就是==一系列函数的集合==,当应用被启动时,这些函数就会被执行, 示例中创建了叫做“myApp”的AngularJS模块, 注意里面有个空的数组,这个数组是myApp模块依赖的模块的列表,为空代表会创建一个模块.

      // 创建myApp区域的模块
      var app = angular.module("myApp", []);
      
    4. 控制器(Controller): 控制 AngularJS模块的数据, 示例中为myApp模块增加了一个叫做myCtrl的控制器, 通过ng-controller="myCtrl" 在DOM中创建控制器并划定了控制的范围, ==同时创建了这个范围的作用域scope对象==, 在js控制器中可以传入并且访问scope对象, 例子中在$scope中创建了student对象, 我们就可以在ng-controller="myCtrl"属性的DOM元素==任何子元素==里访问这个student对象,实现双向绑定.

      // HTML
      <div ng-controller="myCtrl">
         //... ...
      </div>
      
      // JS
      app.controller('myCtrl', function ($scope) {
          $scope.student = {
              name: "Jason",
              age: 17,
              date: "2015-04-01"
          };
      });
      
    5. **作用域(scope)**: 是一个对象,有可用的方法和属性, 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带, 示例中,在myCtrl的控制器中传入了scope对象, 在$scope中添加任何方法和属性, 在HTML(视图)指定的控制器下的DOM元素都可以访问这些属性方法.

      1. 作用域范围: 所有的应用都有一个 rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中。rootScope 可作用于整个应用中。是各个 controller 中 scope 的桥梁。用 rootscope 定义的值,可以在各个 controller 中使用。
        <body ng-app="myApp">
            <div ng-controller="ParentController">
                <div ng-controller="ChildController">
                </div>
            </div>
        </body>
        
    6. 指令(Directive)和表达式: 上面的示例中不断出现各种原生HTML中没有的各种属性, 其实他们在AngularJS中叫做指令, AngularJS为我们创建了很多指令, ==指令实际上就是绑定在DOM元素上的函数==, 可以调用方法(ng-click), 定义行为(ng-app), 绑定控制器(ng-controller), 绑定数据(ng-model)等等.

      ng-app: 指令定义了AngularJS应用程序的根元素
      ng-model: 指令绑定HTML元素到应用程序数据。
      ng-controller: 指令定义了应用程序控制器。
      ... ...
      
      {{student.name}} : 表达式与 ng-model="student.name" 相同, 实现数据绑定
      
      1. 指令执行: 当一个AngularJS应用启动,Angular编译器就会遍历DOM树(从有ng-app指令属性的那个DOM元素开始),解析HTML,寻找这些指令函数。当在一个DOM元素上找到一个或多个这样的指令函数,它们就会被收集起来、排序,然后按照优先级顺序被执行
    7. 服务(Service): Services都是单例的,就是说在一个应用中,每一个Service对象只会被实例化一次(用$injector服务),主要负责==提供一个接口把特定函数需要的方法放在一起==, 就拿上面讲依赖注入的AgeService服务举例子, 这个服务就提供了判断是否成年的函数方法, 在需要的时候注入就可以直接使用, 非常方便. 同样, AngularJS内建了很多服务, 实现了很多功能, 以后在开发的时候直接注入进来就可以用了

      app.service('AgeService', function() {
        // 用于判断年龄是否是成年人
         this.judgeAdult = function(age) {
            if (age >= 18) {
                 return true;
            } else {
                 return false;
            }
         }
      }); 
      
  2. 详细的AngularJS使用教程: AngularJS教程 | 菜鸟教程
上一篇下一篇

猜你喜欢

热点阅读