关于 Angular.js 应用里的 $scope.$apply()

简介: 关于 Angular.js 应用里的 $scope.$apply()

2秒钟后:

源代码:

<html ng-app="nameApp">
  <head>
    <meta charset="utf-8">
    <title>Angular.js Example</title>
    <script src="angular/angular.js"></script>
    <script>
      var nameApp = angular.module('nameApp', []);
      nameApp.controller('NameCtrl', function ($scope){
        $scope.firstName = 'John';

        $scope.$watch('lastName', function(newValue, oldValue){
          console.log('new value is ' + newValue);
        });

        setTimeout(function(){
          $scope.lastName = 'Smith';
          $scope.$apply();
        }, 2000);
      });
    </script>
  </head>
  <body ng-controller="NameCtrl">
    First name:<input ng-model="firstName" type="text"/>
    <br>
    Last name:<input ng-model="lastName" type="text"/>
    <br>
    Hello {{firstName}} {{lastName}}
  </body>
</html>

这段代码是一个简单的AngularJS示例,用于展示基本的模块定义、控制器创建、双向数据绑定、以及如何监视模型变化。下面是代码的详细解析:

  1. AngularJS 应用定义
<html ng-app="nameApp">

这行代码定义了一个名为 nameApp 的 AngularJS 应用。ng-app 指令告诉 AngularJS,页面上的这个 HTML 元素及其子元素构成了 AngularJS 应用的边界。


2.模块定义

var nameApp = angular.module('nameApp', []);

这行 JavaScript 代码定义了一个名为 nameApp 的新模块。这个模块当前没有依赖(依赖数组为空),这是AngularJS应用的起点。

3.控制器定义

nameApp.controller('NameCtrl', function ($scope){
  ...
});

在 nameApp 模块中定义了一个控制器 NameCtrl。控制器是一个JavaScript函数,用于增强 AngularJS 的作用域。这里 $scope 是一个特殊的对象,AngularJS 使用它来传递数据和方法。


4.变量绑定和监视

$scope.firstName = 'John';

控制器函数内,我们设置 $scope.firstName 初始化为 “John”。

$scope.$watch('lastName', function(newValue, oldValue){
  console.log('new value is ' + newValue);
});

这是 $scope$watch 方法,用于监视 lastName 属性的变化。每当 lastName 的值发生变化时,都会执行回调函数,打印新的值。

5.异步更新和 $apply

setTimeout(function(){
  $scope.lastName = 'Smith';
  $scope.$apply();
}, 2000);

使用 setTimeout 函数模拟异步操作,在 2000 毫秒后将 lastName 更改为 “Smith”。由于这是在 AngularJS 的作用域之外的异步操作,所以需要手动调用 $scope.$apply() 来触发脏值检查,从而更新绑定并反映在视图上。

6.HTML 视图与数据绑定

<body ng-controller="NameCtrl">
  First name:<input ng-model="firstName" type="text"/>
  <br>
  Last name:<input ng-model="lastName" type="text"/>
  <br>
  Hello {{firstName}} {{lastName}}
</body>

在 HTML 部分,使用 ng-controller 指定 NameCtrl 控制器控制 body 标签内的元素。ng-model 指令用于在输入框和 $scope 对象的属性之间建立双向数据绑定。插值表达式 {{firstName}} {{lastName}} 用于在页面上显示这些变量的值。


通过上述的组件和机制,这个 AngularJS 示例展示了如何在应用中处理数据、监视数据变更,并在数据变更时更新视图。

相关文章
|
18天前
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
23 1
JavaScript基础知识-作用域(action scope)
|
2天前
|
JavaScript
js的this与call,apply,bind
js的this与call,apply,bind
|
9天前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
本文深入探讨了JavaScript中闭包的概念,从定义、作用域链和实际应用等方面进行了详细阐述。通过生动的比喻和实例代码,帮助读者理解闭包在函数执行上下文中的重要性,以及如何在实际开发中有效利用闭包解决复杂问题。同时,文章也指出了过度使用闭包可能导致的潜在问题,并给出了相应的优化建议。
|
7天前
|
缓存 JavaScript 前端开发
Angular 应用打包和部署
Angular 应用打包和部署
31 1
|
17天前
|
JavaScript API 数据库
深入理解Node.js事件循环及其在后端开发中的应用
【9月更文挑战第3天】本文将深入浅出地介绍Node.js的事件循环机制,探讨其非阻塞I/O模型和如何在后端开发中利用这一特性来处理高并发请求。通过实际的代码示例,我们将看到如何有效地使用异步操作来优化应用性能。文章旨在为读者揭示Node.js在后端开发中的核心优势和应用场景,帮助开发者更好地理解和运用事件循环来构建高性能的后端服务。
|
18天前
|
缓存 JavaScript 前端开发
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
18 2
|
21天前
|
JavaScript 前端开发 开发者
|
21天前
|
C# 开发者 测试技术
震惊!Xamarin 竟能如此构建跨平台应用程序,代码共享、界面设计与性能优化全攻略大揭秘!
【8月更文挑战第31天】在移动应用开发领域,跨平台工具日益受到青睐。Xamarin 是一款强大的工具,支持使用 C# 开发适用于 iOS、Android 和 Windows 的应用。通过安装 Visual Studio 或 Visual Studio for Mac,并创建 Xamarin 项目,开发者可以利用丰富的功能和工具进行开发。Xamarin 的主要优势在于代码共享,能够显著提高开发效率。
41 0
|
21天前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
36 0
|
21天前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第31天】 本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。