关于 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 示例展示了如何在应用中处理数据、监视数据变更,并在数据变更时更新视图。

相关文章
|
14天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
111 2
|
9天前
|
缓存 监控 JavaScript
Angular 应用打包和部署
【10月更文挑战第16天】Angular 应用的打包和部署是一个综合性的过程,需要考虑多个方面的因素。通过合理的打包和部署策略,可以确保应用在生产环境中稳定运行,并为用户提供良好的体验。你需要根据实际情况选择合适的部署方式,并不断优化和改进部署流程,以适应业务的发展和变化。
|
5天前
|
JavaScript 前端开发 开发者
探索JavaScript原型链:深入理解与实战应用
【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
13 1
|
9天前
|
JavaScript 前端开发
JS高级—call(),apply(),bind()
【10月更文挑战第17天】call()`、`apply()`和`bind()`是 JavaScript 中非常重要的工具,它们为我们提供了灵活控制函数执行和`this`指向的能力。通过合理运用这些方法,可以实现更复杂的编程逻辑和功能,提升代码的质量和可维护性。你在实际开发中可以根据具体需求,选择合适的方法来满足业务需求,并不断探索它们的更多应用场景。
5 1
|
17天前
|
JavaScript 前端开发 API
Vue.js:打造高效前端应用的最佳选择
【10月更文挑战第9天】Vue.js:打造高效前端应用的最佳选择
15 2
|
17天前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
14天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示
|
15天前
|
监控 JavaScript 前端开发
深入了解Vue.js:构建现代前端应用的利器
【10月更文挑战第11天】深入了解Vue.js:构建现代前端应用的利器
11 0
|
15天前
|
前端开发 JavaScript 开发者
深入了解Webpack:现代JavaScript应用的打包利器
【10月更文挑战第11天】 深入了解Webpack:现代JavaScript应用的打包利器
|
15天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript闭包:原理与应用
【10月更文挑战第11天】深入理解JavaScript闭包:原理与应用
14 0