【问题标题】:Why Angular JS input model value does not get updated if i update value of input field using javascript ex: using setTimeout如果我使用javascript更新输入字段的值,为什么Angular JS输入模型值不会更新例如:使用setTimeout
【发布时间】:2016-04-21 15:49:36
【问题描述】:

我有一个模型名为“name”的输入字段,其中一些初始化值为“James”。

当我控制台 $scope 时,我可以看到模型值为“James”。 IE。 $scope.name = "詹姆斯"。

但如果我使用 setTimeout 函数并再次使用 Say "Marcus" 和控制台 $scope 更新输入字段值,那么在下一条语句中,为什么我只得到 $scope.name = "James"。

我知道,我通过开箱即用的方式更新了输入字段值,而 Angular 和 Angular 不知道更新。

所以我真正的问题是,Angular JS 是用 Javascript 语言编写的吗?如果是,为什么使用 setTimeout 未更新 $scope 中的模型值。

请帮助我,如果我在想/问题是对还是错。

【问题讨论】:

  • 请提供一个plunkr。
  • 没有任何与编码有关的问题我的实际问题是:我可以说,Angular JS 不是用 Javascript 编写的,这意味着 Angular 和 Javascript 是相互独立的。和我的同事辩论。
  • Angular JS 实现了 JavaScript 提供的很多功能。以你提到的超时时间为准。Angular JS 也使用与 seen here 相同的方法。基于我使用 Angular 的工作,我经常使用它们的组合.
  • 另外,你不能直接从浏览器开发控制台console.log $scope.name。你在哪里做控制台日志?
  • 谢谢@Satej,但我的问题是为什么需要有角度的 $settimeout 函数本身,如果角度 js 是基于 javascript 的,它应该与模型更新的 Javascript 的正常 setTimeout 一起工作

标签: angularjs


【解决方案1】:

这与 Angular 如何处理两种方式的数据绑定和摘要循环有关。如果您有兴趣了解其工作原理的所有细节,则可以在此处阅读:https://www.ng-book.com/p/The-Digest-Loop-and-apply/

基本思想是,在 Angular 中,摘要循环用于跟踪您放置在 $scope 中的所有变量。每当一个变量发生变化时,它都会启动摘要循环,在循环的每个循环中,变量的新值都会与旧值进行比较并相应地更新,直到新值等于旧值,从而结束循环。话虽如此,只有在 Angular 的上下文中更改变量时才有效,对于在回调函数或 jquery 中更改变量尤其如此。 Angular 不知道变量已更改,因此摘要循环永远不会启动,您可以使用 $scope.$apply 强制它,但通常应避免某些情况,除非没有角度替代它(通常不是这种情况)。

对于 setTimeout,有一个 angular 替代方案 $timeout,它具有与 setTimeout 完全相同的功能,但它在 angular 的上下文中工作,因此您的变量将被更新。

【讨论】:

  • 感谢 Ahmed 的详细回答,但它仍然与我的同事提出相同的论点,我真的可以说 Angular JS 不是用 Javascript 编写的吗?或者它诱使我说 Angular Js 不是 Javascript 框架??
  • 当然它是一个 javascript 框架,但它有一定的规则(语法),你必须遵守它才能正常工作。这适用于任何 js 框架。与 reactjs 中的方法类似,如果您想更新视图中的变量,您不能只使用用户 x = newValue,您必须使用 setState 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2022-12-15
相关资源
最近更新 更多