AngularJS表达式:数组、对象、$eval、字符串

⚡ 智能摘要

AngularJS表达式是放置在双花括号内的代码片段,可将数据直接绑定到模板中。它们可以计算数字、字符串、对象和数组,而`$eval`函数则在控制器内部执行相同的计算。

  • 🧩 绑定语法: Double 花括号会在表达式所在位置渲染一个值,从而得到与 ng-bind 指令相同的结果。
  • 🔢 支持的类型: Numbers字符串, Java使用点号表示法访问的脚本对象和使用索引访问的数组都能正确求值。
  • 🏷️ 内联变量: ng-init 指令声明视图级别的变量,然后表达式无需控制器即可读取这些变量。
  • 🛡️ 宽容的评价: 未定义的属性返回 undefined,而不是抛出 ReferenceError 异常。 Java脚本会启动。
  • 🚫 硬限制: 循环、异常、函数声明、正则表达式以及逗号和 void 运算符均不可用。
  • ⚙️ 控制器评估: $scope.$eval 计算控制器代码中的表达式字符串,并将结果公开给视图。
  • ⚠️ 支持状态: AngularJS 已于 2021 年 12 月 31 日停止维护,不再接收安全补丁。

AngularJS 表达式

什么是AngularJS表达式?

表达式是用双花括号括起来的变量。 {{ }}它们在 AngularJS 中非常常用,并且在本系列的早期教程中都有出现。

⚠️ 支持通知: AngularJS 已达到 生命终结日期为2021年12月31日 并且不再接收任何补丁或安全修复。以下语法仍然适用于维护现有的 AngularJS 1.x 应用程序;新项目应使用现代语法。 角度方向,其中插值括号仍然存在,但 ng-init$eval 不要。

用示例解释 AngularJS 表达式

AngularJS表达式写在双花括号内,例如: {{expression}}.

语法: 表达式的一个简单例子是 {{5 + 6}}.

AngularJS 表达式以与 ng-bind 指令相同的方式将数据绑定到 HTML,并且 AngularJS 会将数据准确地显示在表达式所在的位置。

在这个例子中,我们用表达式来表示简单的数字加法。

AngularJS 表达式

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="">
        Addition : {{6+9}}
    </div>

</body>
</html>

Code 说明:

  1. ng-app 指令为空,这意味着没有模块提供控制器。 指令或为本页面提供服务。
  2. 一个简单的表达式可以将两个数字相加。

输出:

AngularJS 表达式

9 加 6 的结果显示为 15。

AngularJS Numbers

表达式处理的是数字。这个例子将两个数字变量相乘。 marginprofit并展示该产品。

AngularJS Numbers

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="" ng-init="margin=2;profit=200">
        Total profit margin

        {{margin*profit}}
    </div>

</body>
</html>

Code 说明:

  1. ng-init 指令在视图本身中定义变量及其值,就像任何代码中的局部变量一样。 编程语言。 这里 marginprofit 已声明并赋值。
  2. 然后该表达式将这两个局部变量相乘。

输出:

AngularJS Numbers

2 乘以 200,结果为 400。

AngularJS 字符串

表达式也适用于字符串。此示例定义了 firstNamelastName 并同时显示两者。

AngularJS 字符串

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="" ng-init="firstName='Guru';lastName='99'">
        First Name : {{firstName}}<br>
        Last Name : {{lastName}}
    </div>

</body>
</html>

Code 说明:

  1. ng-init 指令定义 firstName 值为“Guru“和 lastName 值为“99”。
  2. 表达方式 {{firstName}}{{lastName}} 读取这些变量并将它们显示在视图中。

输出:

AngularJS 字符串

屏幕上会显示这两个数值。

AngularJS 对象

表达式与 JavaScript 对象由名称-值对组成。语法如下: Java脚本对象如下所示:

var car = {type: "Ford", model: "Explorer", color: "White"};

这个例子定义了一个 person 包含两个键值对的对象, firstNamelastName.

AngularJS 对象

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<h1>Guru99 Global Event</h1>

<div ng-app="" ng-init="person={firstName:'Guru',lastName:'99'}">
    First Name : {{person.firstName}}<br>
    Last Name : {{person.lastName}}
</div>

</body>
</html>

Code 说明:

  1. ng-init 指令定义了对象 person 使用键值对 firstName 调成 ”Guru“和 lastName 设置为“99”。
  2. 表达方式 {{person.firstName}}{{person.lastName}} 读取这些成员。由于它们属于对象,因此需要使用点号表示法来获取它们的值。

输出:

AngularJS 对象

的价值观 firstNamelastName 出现在屏幕上。

AngularJS 数组

表达式可以处理数组。以下示例定义了一个数组,其中包含一名学生三门科目的成绩,并显示每个值。

AngularJS 数组

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<h1>Guru99 Global Event</h1>

<div ng-app="" ng-init="marks=[1,15,19]">
    Student Marks<br>
    Subject1 : {{marks[0]}}<br>
    Subject2 : {{marks[1]}}<br>
    Subject3 : {{marks[2]}}
</div>

</body>
</html>

Code 说明:

  1. ng-init 指令定义了数组 marks 三个值分别为 1、15 和 19。
  2. 形如 marks[index] 阅读每个元素。

输出:

AngularJS 数组

显示数组中定义的标记。

AngularJS 表达式的功能和限制

能力

  1. AngularJS表达式类似于 Java脚本表达式与函数具有许多相同的功能和灵活性。
  2. 地点 Java脚本对未定义的属性引发 ReferenceError 或 TypeError,AngularJS 的执行比较宽容,会返回 undefined 或 null。
  3. 在表达式中可以使用过滤器来格式化数据,然后再显示数据。
  4. 支持三元运算符,因此 {{ isReady ? 'Yes' : 'No' }} 已验证。

限制

  1. AngularJS表达式中不能使用循环和异常处理。条件逻辑仅限于三元运算符; if 暂无相关声明。
  2. 函数不能在表达式中声明,即使是在 ng-init 指令中也不行。
  3. 正则表达式不能创建在表达式内部。正则表达式是由符号和字符组成的组合,用于匹配字符串,例如: .*\.txt$这样的字面意思会被拒绝。
  4. 逗号运算符(,)和 void 操作员不得入内。

ng-bind 与表达式大括号:应该使用哪一个?

Double 使用花括号和 ng-bind 指令渲染出的结果相同,因此选择哪一个看起来似乎无关紧要。但事实并非如此。在 AngularJS 加载完成之前,两者的行为有所不同,而这种差异对于页面用户来说是显而易见的。

方面 {{ expression }} ng-bind
写入 元素内容 元素属性
在 AngularJS 加载之前 原始括号在屏幕上闪烁 什么也没显示
可读性 更高——该值处于正常水平 较低的值隐藏在属性中
每个元素有多个值 不,只有一个绑定
一次性装订 是的,有 {{::value}} 是的,有 ng-bind="::value"

短暂出现的原始大括号被称为未插值内容的闪现,这是因为浏览器在 AngularJS 编译之前就渲染了标记。对于首屏可见的内容,请使用 ng-bind 指令或添加 ng-cloak 指令。在其他情况下,尤其是当一个元素内包含多个值时,大括号仍然是更清晰易读的选择。

表达式和$eval之间的区别

$eval 函数在控制器内部计算表达式。表达式在视图中计算,而 $eval 在控制器代码中进行评估。

这个例子使用 $eval 将两个数字相加,并将结果放在作用域对象上,以便视图可以显示它。

表达式和$eval之间的区别

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<div ng-app="sampleApp" ng-controller="AngularController">
    <h1>Guru99 Global Event</h1>
    {{value}}
</div>

<script>
    var sampleApp = angular.module('sampleApp', []);
    sampleApp.controller('AngularController', function($scope) {
        $scope.a = 1;
        $scope.b = 1;

        $scope.value = $scope.$eval('a+b');
    });
</script>

</body>
</html>

Code 说明:

  1. 两个作用域变量, ab每个元素的值都为 1。
  2. $scope.$eval 计算它们的和并将结果赋值给作用域变量 value.
  3. 然后视图显示 value.

输出:

表达式和$eval之间的区别

输出结果显示了表达式在内部的求值情况。 调节器并将两个作用域变量的总和发送到视图中并显示。

常见问题

在表达式前加上两个冒号,例如: {{::name}}一旦某个值被解析,它就会停止监视。这会移除监视者,并降低包含大量静态绑定的页面的摘要开销。

$eval 立即将字符串与某个值进行比较 范围. $parse 返回一个可重复使用的函数,以便重复求值。 $interpolate 处理的是包含大括号的整个模板字符串,而不是单个表达式。

大多。 AI 工具会保留花括号并将过滤器重写为管道,但 ng-init 变量没有 Angular 等效项,必须手动将其移到组件类中。

AI 工具会扫描模板中绑定内的函数调用(这些函数调用会在每个摘要周期重新运行),并建议将结果缓存到作用域或切换到一次性绑定。

AngularJS 的求值机制比较宽容。如果属性缺失,则会返回 undefined,渲染为空字符串,因此空值通常意味着属性路径拼写错误,而不是运行时错误。

总结一下这篇文章: