0

我在基于 Angular 的网站中使用 jasper 报告。Jasper 报告的形象化.js 包括 jQuery。当我加载报告时,我会更新我范围内的值

$scope.reportLoaded = true

但没有在页面中更新

{{reportLoaded}} //false

我想这可能是 Angular 和 jQuery 之间的冲突。解决这个问题的唯一方法是使用 $scope.$$apply() 我读过我们不应该使用它。如何在不使用应用的情况下解决此问题?如果没有其他方法可以解决问题,使用它是否安全?

4

2 回答 2

0

范围内任何不是由 Angular 完成的更新对 Angular 来说都是不明显的。所以你必须$scope.$apply();在更新 current 中的任何值时使用$scope

Angular 是一种双向数据绑定机制,因此当您更改模型时会更新视图,反之亦然。内部 angular 运行一个$digest循环,该循环执行当前的所有检查$scope。只要您$scope在角度内的变量中进行更新,事情就会正常进行,但在它之外,如果您使用本机 javascript 或其他库(如 jQuery)更改值,则$digest必须运行循环,这很$scope.$apply()方便。


$scope.$digest()也非常有用,它比$scope.$apply()$scope.$digest()当前范围内运行但在内部$scope.$apply()运行$rootscope并在内部触发时要快得多$rootscope.$digest()

$scope.$digest()要首先使用它,您需要设置一个范围观察器,它的实际作用是,它会不断地观察范围的变化,无论如何,无论是来自角度还是来自像你这样的其他来源,在这种情况下都是设置范围观察器的完美示例如果你想使用 with $scope.$digest()

$scope.$watch('reportLoaded', function(newValue, oldValue, scope) {
   scope.reportLoaded = newValue !== oldValue ? newValue : oldValue;
});
于 2015-09-17T13:52:56.553 回答
0

在这些情况下,您必须使用 $apply。这就是 $apply 的用途。这是为了说

“嘿,角度,我在你不知情的情况下做了一些更改。你最好运行你的脏检查机制,看看发生了什么变化”

所以,使用 $apply

于 2015-09-17T13:51:57.560 回答