我在基于角度的网站上使用jasper报告。 Jasper报告的visualize.js包含jQuery。当我加载报告时,我更新了我的范围中的值
$scope.reportLoaded = true
但未在页面中更新
{{reportLoaded}} //false
我想这可能是角度和jQuery之间的冲突。解决这个问题的唯一方法是使用$ scope。$$ apply()我已经读过,我们不应该使用它。如何在不使用申请的情况下解决此问题?如果没有其他方法可以解决问题,那么使用它是否安全?
答案 0 :(得分:0)
你必须在这些情况下使用$ apply。这就是$ apply的用途。这是为了说
"嘿,有角度,我在你不知情的情况下做了一些改变。你应该更好地运行脏检查机制,看看有什么变化"
所以,使用$ apply
答案 1 :(得分:0)
范围内未通过角度进行的任何更新都不会对角度有明显的影响。因此,当您更新当前$scope.$apply();
中的任何值时,必须使用$scope
。
Angular是一种双向数据绑定机制,因此当您更改模型时会更新视图,反之亦然。内部角度运行$digest
周期,执行当前$scope
中的所有检查。只要你在角度内的$scope
变量中进行更新就会正常但不在其中,如果你用原生javascript或其他库如jQuery更改值,那么必须运行$digest
循环,这是$scope.$apply()
派上用场的地方。
$scope.$digest()
也非常有用,它比$scope.$apply()
快得多,因为它$scope.$digest()
在当前范围内运行但$scope.$apply()
在$rootscope
上运行并且在内部触发$rootscope.$digest()
。
$scope.$digest()
首先要使用它,你需要设置一个范围观察器,它实际上是做什么的,它会不断地观察范围的变化,无论是角度还是来自像你这样的其他来源。如果要与$scope.$digest()
一起使用,则是设置范围观察器的完美示例。
$scope.$watch('reportLoaded', function(newValue, oldValue, scope) {
scope.reportLoaded = newValue !== oldValue ? newValue : oldValue;
});