为什么赋值在 Angular 表达式中并不总是有效?

2024-02-09

我刚刚发现 Angular 表达式中允许的内容存在这种有趣的明显不一致:

  1. 可以在表达式中执行赋值
  2. 如果赋值涉及 ngRepeat 中的局部变量,则会中断
  3. 这可以通过使用控制器中定义的 setter 而不是表达式中的赋值来克服

参见普朗克 http://plnkr.co/edit/Lt57nqfm3TH7XdFa5xML?p=preview

The 关于表达式的文档 http://docs.angularjs.org/guide/expression似乎只是明确禁止表达式中的控制流,并且我没有看到任何提及上述行为的内容。

我想从中得出的结论是,无论如何使用 setter 可能是更好的设计模式,但是有人知道关于表达式中可能的内容的更明确的参考吗?

如果 Angular 单方面禁止对它们进行赋值,也许会更好。 (一个相关的不一致是,似乎可以在 i = i+1 的表达式中递增,但 i+=1 则不行...)


这是指令范围的一个已知问题。你可以阅读这篇文章范围原型继承的细微差别 https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance了解更多关于scoping在角度js中。

来自子/嵌入范围的任何原始值分配都将创建一个新的实例值,而不是更改父范围值

在您的情况下,您正在使用原始值selectedNumber.

有两种建议的方法可以修复它

解决方案1
使用对象而不是原始值。

  1. 将 selectedNumber 更改为对象scope.selectedNumber = { num : 1 };
  2. 将显示更改为<h2>{{ selectedNumber.num }}</h2>
  3. 更改点击处理程序ng-repeat to ng-click="selectedNumber.num = number"

Demo: Plunker http://plnkr.co/edit/TxPD9lKFI9T4S5uZ4i07?p=preview

解决方案2:
Use $parent范围参考

  1. 更改点击处理程序ng-repeat to ng-click="$parent.selectedNumber = number"

Demo: Plunker http://plnkr.co/edit/e6ncIbHiKRz6rX94XlXh?p=preview

解决方案3:
在父作用域中使用 setter

  1. 在父作用域中创建一个 setter 方法,例如$scope.setSelectedNumber = function(num){ $scope.selectedNumber = num}
  2. 将点击事件更改为setSelectedNumber(number)(这是已经用过的方法)

Update:
正如 Anders Ekdahl 所建议的,建议使用基于对象(解决方案 1)的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么赋值在 Angular 表达式中并不总是有效? 的相关文章

随机推荐

  • 从 erlang 插入 cassandra

    我正在尝试从 Erlang R14B02 通过 thrift 0 6 1 将一些内容插入到 cassandra 0 7 6 中 我正在做以下事情 读取记录定义 rr cassandra types 连接到卡桑德拉 ok C thrift c
  • TopMost = true 的 WinForms 对话框

    我在 WinForms 中实现了一个对话框 该对话框在屏幕右下角显示为通知对话框 问题是 无论何时显示 它都会获得焦点 并且只有当 TopMost true 时才会发生这种情况 我该如何解决这个问题 您需要继承 Form 并覆盖几个属性 F
  • 每个 Docker 容器一个或多个数据库

    假设我有几个不同的容器 每个容器都使用自己的数据库 在这种情况下 关于性能的最佳实践是什么 运行一个容器 比如一台 MySQL 服务器 其中包含所有数据库 还是每个数据库运行一个数据库服务器容器 除了表演之外 任何其他评论都将受到欢迎 由于
  • Android Studio 3.1.1中Aapt2错误

    我将 android studio 从 2 2 更新到 3 1 它总是给我aapt2 error并且构建失败 我添加了android enableAapt2 false在 gradle properties 中 我的项目成功构建 但出现警告
  • Laravel 中的长轮询(sleep() 函数使应用程序冻结)

    我正在尝试在 Laravel 中编写长轮询功能 但是当我使用 sleep 函数时 整个应用程序会冻结 阻塞 直到 sleep 函数完成 有谁知道如何解决这个问题 我的 JavaScript 看起来像这样 function startRefr
  • 自托管 MVC 5 项目

    嘿 您知道如何在桌面上没有本地 IIS 或 IIS Express 的情况下运行 MVC 5 项目吗 在 ASP NET vNext 中 有一个 WebListener 使这成为可能 但我无法将我的项目重新组织为 ASP NET vNext
  • “GridView1”触发了未处理的事件 PageIndexChanging

    我正在使用 gridview 我想使用分页 我已经将允许分页设置为 true 并将页面大小设置为 5 我可以看到 gridview 底部的数字 但是当我单击数字移动到相应页面时 它会抛出错误 The GridView GridView1 f
  • Windows Batch 中嵌套循环中的“继续”等效命令

    我有一个批处理文件 其中包含嵌套循环continue类似命令 for i in 1 2 4 8 16 32 64 128 256 do for j in 1 2 4 8 16 32 64 128 256 do if i gtr j goto
  • jdk1.7/jre/lib/rt.jar的访问限制

    大家好 我在创建 JAXB 解析器时遇到了一个非常奇怪的问题 当我尝试从 eclipse 生成 JAXB 类时 在一个类中它显示了一个非常奇怪的错误 即 Access restriction The type QName is not ac
  • 无法解析 org.tensorflow:tensorflow-lite:0.0.0-nightly

    我下载了最新的tensorflow lite demo 展示一下 Unable to resolve dependency for app debug compileClasspath Could not resolve org tenso
  • 可以阻止 Django 截断长表名吗?

    我将 Django 与现有的 Oracle 数据库 即表不是由 Django 创建的数据库 一起使用 因此 在我的模型中 我必须通过在 Meta 类中指定 db table 的值来指示表名称 我遇到了问题 因为我希望访问的表属于与我拥有凭据
  • 使用多个模板显示页面内容 - WordPress

    是否可以有这样的页面 www site com page 并使用以下命令显示不同的模板版本 www site com page template default www site com page template archive 因此它检
  • C++ 联合体、结构体、成员类型

    如果我有课 class Odp int i int b union long f struct WCHAR pwszFoo HRESULT hr 联合意味着 在列出的所有值中 它一次只能采用其中一个值 就访问这些变量而言 它是如何工作的 我
  • 如何在Python中的图像上打印印地语句子(unicode)?

    我有一个名为 hindi txt 的文件 其内容如下 我使用的是Python3 5 9 59000 Cr 36 WhatsApp Allo 10 150
  • 在 Cython 中分配中间多维数组而不获取 GIL

    我正在尝试使用 Cython 并行化涉及生成中间多维数组的昂贵操作 以下非常简化的代码说明了我正在尝试做的事情 import numpy as np cimport cython cimport numpy as np from cytho
  • 从 Windows NT 设备路径转换为驱动器号路径

    如何解析设备路径中带有驱动器号的路径 例如 转换 Device HarddiskVolume4 Windows System32 RuntimeBroker exe into C Windows System32 RuntimeBroker
  • 在 xml 文件中搜索数据的最佳方法?

    在我们的新项目中 我们必须提供搜索功能来从数百个 xml 文件中检索数据 下面我简要介绍了我们目前的计划 我想知道您对此的建议 改进 这些 xml 文件包含个人信息 搜索基于其中的 10 个元素 例如姓氏 名字 电子邮件等 我们当前的计划是
  • grep -f 的性能问题

    我正在使用 grep 在单个文件中搜索多个正则表达式 特别是 我正在考虑100 MB 文件 带英文字幕 https drive google com open id 0B3oOQ14 tellNzhlU0tKT2xFSW8并运行存储在文件中
  • ng-click 在 ag-grid 单元格内不起作用

    我正在使用 ag grid 我需要在单元格中添加一些自定义链接 并希望在其上调用 ng click 函数 这是我的代码 var columnDefs headerName ID field id headerName Template Na
  • 为什么赋值在 Angular 表达式中并不总是有效?

    我刚刚发现 Angular 表达式中允许的内容存在这种有趣的明显不一致 可以在表达式中执行赋值 如果赋值涉及 ngRepeat 中的局部变量 则会中断 这可以通过使用控制器中定义的 setter 而不是表达式中的赋值来克服 参见普朗克 ht