$ watchCollection可以多次闪现多次更改观看的收藏?

时间:2014-08-28 13:24:10

标签: angularjs

假设我有这段代码:

var dateRange = {startDate: null, endDate: null};
$scope.$watchCollection(dateRange, function() {} );
dateRange.startDate = new Date();
dateRange.endDate = new Date();

多少次"可以"回电火?我看到它大部分被解雇了,但我不知道这是否是一种保证。我假设如果在两个赋值之间触发摘要循环,那么回调将被触发两次。如果这是可能的,我能想到的唯一解决方法是:每当一个或两个日期发生变化时创建一个新的日期范围对象,然后$观察dateRange变量的变化。 任何人都可以建议任何其他解决方法吗?

3 个答案:

答案 0 :(得分:2)

$watch$watchCollection之间没有功能差异。在摘要阶段,人们只会检查比另一个更多的值。

Javascript在单线程事件循环上运行。你应该看看更多,但基本上 - >这意味着它从头到尾运行一个任务(函数),然后检查调用堆栈以查看是否在此期间添加了一个函数,如果是,则运行它,然后等待或运行堆栈中的下一个。向调用堆栈添加函数的常用方法包括超时,间隔和http请求(带回调)。 http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

因此,仅仅因为javascript中的变量改变了:$scope.name = "bob",并不意味着摘要周期将在此更改后按字面运行。它必须在它返回到调用堆栈之前运行它所处的任何函数来查看(并运行摘要循环)。什么是基本上在角度上下文中发生,是角度(幕后)将在每次使用$ scope或服务函数等时自动运行摘要周期。

因此,在上面的示例中,dateRange变量正在使用相同的函数进行更改,因此摘要循环只会被抛出一次,因为它没有机会进行分配。

以下是两种情况的示例。第一个是监视变量在同一个函数中改变两次,第二个是变量在函数(控制器)中改变一次,angular运行摘要循环,然后在异步$ timeout回调中再次改变又一次火了。

http://jsfiddle.net/zcqvd0vd/

答案 1 :(得分:0)

也许是这样的?

    $scope.dateRange = {startDate: null, endDate: null};    
    dateRange.startDate = new Date();
    dateRange.endDate = new Date();
    $scope.$watchCollection('dateRange', function() {} );

答案 2 :(得分:0)

From Angular's documentation,只要其中任何属性发生变化就会显示,因此对它的触发频率应该没有限制,它应该正常工作。

但是,此方法的第一个参数应该是一个字符串,它是在范围内计算的表达式。

$scope.dateRange = dateRange;
$scope.$watchCollection("dateRange", function () {});