当前位置: 首页 > 面试题库 >

数据绑定在AngularJS中如何工作?

公西宏毅
2023-03-14
问题内容

数据绑定在AngularJS框架中如何工作?

我尚未在其网站上找到技术细节。数据从视图传播到模型时,或多或少地清楚了它是如何工作的。但是,AngularJS如何在没有设置者和获取者的情况下跟踪模型属性的变化?

我发现有些JavaScript观察程序可以完成这项工作。但是Internet Explorer 6和Internet Explorer 7不支持它们。那么AngularJS如何知道我更改了以下内容并在视图中反映了此更改?

myobject.myproperty="new value";

问题答案:

AngularJS会记住该值并将其与先前的值进行比较。这是基本的脏检查。如果值发生更改,则将触发更改事件。

$apply()从非AngularJS世界过渡到AngularJS世界时,你调用的方法就是调用$digest()。摘要只是普通的脏检查。它适用于所有浏览器,并且完全可以预测。

对比脏检查(AngularJS)与更改侦听器(KnockoutJS和Backbone.js):尽管脏检查似乎很简单,甚至效率很低(我稍后会解决),但事实证明,它一直在语义上是正确的,变更侦听器有很多奇怪的极端情况,并且需要诸如依赖性跟踪之类的东西才能使其在语义上更加正确。KnockoutJS依赖项跟踪是AngularJS所没有的问题的一项聪明功能。

变更侦听器的问题:

  • 该语法非常糟糕,因为浏览器本身不支持它。是的,有代理,但是在所有情况下它们在语义上都不正确,当然,在旧的浏览器上也没有代理。最重要的是,脏检查允许你执行POJO,而KnockoutJS和Backbone.js迫使你从其类继承,并通过访问器访问数据。
  • 更改合并。假设你有一组项目。假设你要在添加循环时将项目添加到数组中,每次添加时,你都会触发更改事件,即呈现UI的事件。这对性能非常不利。你想要的是最后只更新一次UI。更改事件的粒度太细。
  • 更改侦听器会立即在设置器上触发,这是一个问题,因为更改侦听器可以进一步更改数据,从而触发更多的更改事件。这很不好,因为在你的堆栈上,你可能同时发生多个更改事件。假设你有两个数组,无论出于何种原因都需要使它们保持同步。你只能添加一个或另一个,但是每次添加时,都会触发一个更改事件,该事件现在对世界有不一致的看法。这与线程锁定非常相似,由于每个回调都专门执行并完成,因此JavaScript避免了线程锁定。更改事件打破了这一点,因为设置员可能会产生意想不到且不明显的深远后果,从而再次造成线程问题。事实证明,你想要做的是延迟侦听器的执行,并保证,

性能如何?

因此,由于脏检查效率低下,因此我们似乎很慢。这是我们需要查看实数而不是仅具有理论参数的地方,但是首先让我们定义一些约束。

人类是:

  • 慢 -任何比50毫秒都快的速度是人类所无法察觉的,因此可以视为“即时”。

  • 受限 -你在一个页面上不能真正显示超过2000条信息。除此之外,还真是糟糕的UI,人类无论如何都无法处理。

因此,真正的问题是:你可以在50毫秒内在浏览器上进行多少次比较?这是一个很难回答的问题,因为有许多因素在起作用,但这是一个测试用例:http : //jsperf.com/angularjs-digest/6,它创建了10,000个观察者。在现代浏览器上,这仅需不到6毫秒。在Internet Explorer 8上,大约需要40毫秒。如你所见,即使这些天在缓慢的浏览器上,这也不是问题。需要注意的是:比较必须很简单才能适应时间限制…不幸的是,将慢速比较添加到AngularJS中太容易了,因此当你不知道自己要做什么时,很容易构建慢速应用程序是做。但是我们希望通过提供一个检测模块来解决这个问题,该模块将向你展示哪些是比较慢的比较。

事实证明,视频游戏和GPU使用脏检查方法,特别是因为它是一致的。只要它们超过了监视器的刷新率(通常为50-60 Hz,或每16.6-20 ms),任何超过该频率的性能都是浪费,因此,与提高FPS相比,最好消耗更多的资源。



 类似资料:
  • 问题内容: 使AngularJS与其他JavaScript-MVC框架区分开的一件事是,它能够使用绑定将JavaScript中的绑定值回传到HTML。当您为$ scope变量分配任何值时,Angular会“自动”执行此操作。 但是,这有多自动化?有时,Angular不会接受更改,因此我需要调用$ scope。$ apply()或$ scope。$ digest()来通知angular来获取更改。有

  • 问题内容: 我试图弄清楚当我的数据存储在服务中时如何正确处理绑定。 如果将服务放到$ scope中,然后让模板直接绑定到它中,我可以使事情工作,但这似乎是一个糟糕的主意。 我基本上希望拥有它,以便我的视图/控制器能够轻松地将状态更改为服务,并将其反映到各处。 感觉我应该可以执行以下操作,但是不起作用(http://jsfiddle.net/aidankane/AtRVD/1/)。 的HTML JS

  • AngularJS中的数据绑定就是模型与视图间的自动同步。这种实现方式让你能专心地处理你的模型。视图总是模型的投影。当模型改变,视图就会反映这种改变,反之亦然。 传统的模板系统数据绑定 大部分模板系统都是这种绑定方式。 方向:如图所示,它们将模型和模板结合生成视图。这个结合过程产生的视图不是动态更新的。更糟的是,任何用户和视图的交互都不会反映到模型。这意味着开发者要自动写视图和模型双向的同步代码。

  • 问题内容: 我知道这是一个古老且可以回答100次的问题,但是随着最新版本的发布,事情变得越来越复杂,因此引起了我很多困惑。我想知道在指令中为属性声明数据绑定的四种当前可用方法之间的区别是什么。特别: 文字装订 双向装订 方法绑定(尽管有人称它为单向绑定) 单向绑定 我对最后两个之间的差异特别感兴趣,因为它们似乎具有重叠的功能,而且我真的无法说出它们之间的差异和优势。 问题答案: 这是有关隔离范围的

  • 问题内容: 我对所有页面都有一个通用模板,其中包含一个菜单栏,它位于.bar的外面。我位于其中一个页面的内部,我想将输入数据绑定到此模板区域(该区域位于与输入页面不同的控制器下) )。我的意思是当我输入名称时,该名称将出现在模板区域。可以吗?这是the **** 问题答案: 通过遵循始终具有“’ ”的“最佳实践”,可以很容易地避免使用基元出现此问题。在您的ng模型中 -观看3分钟值得。Misko演

  • 问题内容: 我一直在尝试定义指令,以便可以根据字段的类型及其参数(存储在数据库中)以表格形式显示不同的“窗口小部件”。我需要对不同类型的场景做出反应,因此需要使用指令来处理布局。 在玩一些示例时,我想出了 kinda 可以工作的代码: HTML 指示 这似乎可行(尽管明显比* proper * angularJS变量绑定要慢),但我认为必须有更好的方法来做到这一点。谁能阐明这件事? 问题答案: 我