关于AngularJs中监听事件及脏循环的理解

可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件。

AngularJs中对于的监听事件会用到一个scope函数$watch,它包含了三个参数,首先我们在概念上来了解一下:

$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。

$watch(watchExpression, listener, objectEquality);

每个参数的说明如下:

watchExpression(必须):监听的对象,它可以是一个string,将被计算为表达式 ,或函数如function(){return $scope.name}。

listener:当watchExpression(监听对象)变化时会被调用的函数或者表达式,它接收3个参数:newValue(新值), oldValue(旧值), scope(作用域的引用)

objectEquality:是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它。

我写了一个小例子,可能会让大家更好的了解监听模型变化的过程,以下部分是html代码:

<!doctype html>
<html ng-app="exampleApp">
<head>
    <meta charset="utf-8">
    <title></title>
    <link href="../css/bootstrap.css" rel="stylesheet">  //导入了本地bootstrap的框架
</head>

<body ng-controller = "simpleCtrl">
<div class="container">
    <div class="well">

        <div class="form-group">
            <input class="form-control" ng-model="name" type="text">
        </div>
    </div>
</div>
</body>

</html>

然后导入本地的AngularJs框架的文件,javaScript代码如下:

<script src="../angular.min.js"></script>    //导入本地AngularJs文件
    <script>
        angular.module("exampleApp", [])
                .controller("simpleCtrl", function ($scope, $rootScope) {
                    $scope.count = 0;
                    $scope.name = ‘‘;
                    $scope.$watch(‘name‘, function(){  //监听数据模型发生的变化
                        console.log($scope.count++);
                    });
                });
    </script>

代码运行后的结果为

当用户与输入框中的内容发生交互事件时监听事件被触发(无论是增加还是删除),运行结果如下:

接下来为大家分享下脏循环,Angular会运行一个函数$digest来检查scope模型中的数据是否发生了变化。 在$digest循环中,watchers会被触发。当一个watcher被触发时,AngularJS会检测它所监听的scope模型,如果监听对象发生了变化那么关联到该watcher的回调函数就会被调用。 这种方法叫做脏检查。

在angular程序初始化时,会将绑定对象的属性添加为监听对象(watcher),也就是说一个$scope对象绑定了N个属性,就会添加N个watcher。 angular什么时候去脏检查呢?angular所定义的方法中都会触发$digest事件,比如:controller初始化的时候,所有以ng-开头的指令执行后,都会触发脏检查 用户与视图发生交互行为以后会触发脏检查。

调用$digest方法: $scope.$digest();

但是这里就又要牵扯到另一个函数,因为AngularJS并不直接调用$digest(),而是调用$scope.$apply(),$apply方法就是将$digest方法包装了一层,会调用$rootScope.$digest()。因此,一轮$digest循环在$rootScope开始,随后会访问到所有的children scope中的watchers。 $apply()方法接受一个可选参数,可以是string,string将被看作表达式并计算结果,也可以是函数。

当接受function作为参数,会执行该function并且触发一轮$digest循环。 不接受任何参数,触发一轮$digest循环会,检查该$scope里的所有监听的属性。 如果你在AngularJS上下文之外的任何地方修改了model,那么你就需要通过手动调用$apply()来通知AngularJS。

这里有个小例子效果图如下:

因为这里设置了延时触发,所以一段时间过后:

下面是实现代码部分,html代码如下:

<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body ng-controller="MesCtrl">
  {{message}}
</body>

</html>

javaScript代码如下:

<script src="angular.min.js"></script>
<script>
    angular.module("myApp",[]).controller("MesCtrl", function ($scope) {
        $scope.message = "原来的信息";
        $scope.getMessage = function(){
            setTimeout(function(){
                $scope.$apply(function(){
                    $scope.message = "两秒钟之后更新";
                    console.log(‘message:‘ +$scope.message);
//                $scope.$apply();   第二种调用方法
                })
            },2000)
        }
        $scope.getMessage();
    });
</script>

以上就是我所理解的AngularJs中的部分内容,希望大家有什么质疑或见解可以放在评论栏,大家吃好喝好,回见。

时间: 2025-01-16 06:45:12

关于AngularJs中监听事件及脏循环的理解的相关文章

Vue 为什么在 HTML 中监听事件?

为什么在 HTML 中监听事件? 你可能注意到这种事件监听的方式违背了关注点分离(separation of concern)传统理念.不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护上的困难.实际上,使用 v-on 有几个好处: 扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法. 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM

java之Hibenate中监听事件的重写和二级cache缓存

管理缓存和统计缓存 Cache cache  = sessionFactory.getCache(); //清除指定的News对象 cache.evictEntity(News.class, id); //清除所有的news对象 cache.evictEntityRegion(News.class); //清除指定id的news所关联的参与者集合属性 cache.evictColleciton("News.actors",id); //清除所有News关联的参与者集合属性 cache.

Android 监听事件

安卓中监听事件的三种实现方式 1.匿名内部类的实现方式 2.独立类的实现方式 3.实现接口方式实现 一.匿名内部类的实现 1.首先声明一个Button //声明一个Button private Button Listener1; 2.设置Button的监听器,并且通过匿名内部类的方式实现 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置Bu

vue v-on监听事件

在html或jsp页面中我们总能碰到监听DOM事件来触发javaScript代码,下面我们就简单聊聊Vue.js中的监听事件是怎么处理的. 在vue.js中监听事件是通过v-on指令来实现的,先看一下简单的监听事件代码. 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title>

Android中Button的五种监听事件

简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activity本身作为事件监听器,实现onClickListener5.外部类作为监听器 ButtonListenerActivity.class public class ButtonListenerActivity extends AppCompatActivity implements View.On

Android中Preference的使用以及监听事件分析

> 在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局.当然,凡事都有例外,FMRadio应用程序中则使用了View布局结构(可能是该应用程序是marvel公司提供的,如果由google公司做,那可说不准).归根到底,Preference布局结构和View的布局结构本质上还是大同小异,Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性(每个

jquery中,使用append增加元素时,该元素的绑定监听事件失效

举例:如果在一个<div id="resultArea"></div>中,通过append添加一个id="checkOutTip"的文本框,监听值变化.常用的直接$("Selector").on("eventType",function(){})监听事件函数不起作用,例如该按钮的点击监听事件应该这样写: $("#resultArea").on("input property

在Javascript中监听flash事件(转)

在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.call调用这个全局函数即可.2.在非特定的环境下(例如编写通用的flash插件),是不能限制用户的函数名的,所以根本无法约定全局函数:是否可以通过类似js的回调函数的形式实现事件监听呢? 其实js与flash的通信,一般情况下可以进行一些比较简单的通信,如传递基本的数据类型.传递简单的对象.调用函数等,

Android实现TextView中部分文字监听事件

通常我们只需要用TextView来显示文本信息,展示给用户看,而把点击相应的监听事件交给Button等控件来处理,当然TextView也可以实现点击事件.有时候我们要对TextView中的部分文字进行点击,我们应该如何操作呢?一般有以下三种方式: 1,在布局文件中设置TextView的android:autoLink属性,比如设置android:autoLink="phone",则可以点击手机号码直接拨打电话.android:autoLink设置是否当文本为URL链接/email/电话