如何告诉AngularJS“刷新”
如何告诉AngularJS“刷新”
我有一个点击事件发生在我自定义指令的范围之外,所以我没有使用\"ng-click\"属性,而是使用jQuery.click()监听器,并在我的作用域内调用一个函数,代码如下:\n
$('html').click(function(e) { scope.close(); );
\nclose()是一个简单的函数,代码如下:\n
scope.close = function() { scope.isOpen = false; }
\n在我的视图中,我有一个元素与isOpen绑定的\"ng-show\",代码如下:\n
My Div
\n在调试过程中,我发现close()被调用了,isOpen被更新为false,但是AngularJS的视图没有更新。有没有办法告诉Angular手动更新视图?或者有没有更“Angular”的方法来解决这个问题,我没有看到?
AngularJS中的$apply
应该在什么时候调用?
$apply
应该在希望应用在Angular外部进行的更改时调用。
$apply()
用于在AngularJS框架之外执行表达式(例如来自浏览器DOM事件、setTimeout、XHR或第三方库)。因为我们在调用AngularJS框架,所以我们需要执行正确的作用域生命周期,包括异常处理和执行监视。
Angular允许使用任何值作为绑定目标。然后在任何JavaScript代码块结束时,它会检查值是否发生了变化。检查绑定值是否发生变化的步骤实际上有一个方法,$scope.$digest()
。我们几乎从不直接调用它,而是使用$scope.$apply()
(它会调用$scope.$digest
)。
Angular只监视在表达式中使用的变量和作用域内的$watch
中的任何内容。所以,如果你在Angular上下文之外改变了模型,你需要调用$scope.$apply()
来传播这些更改,否则Angular将不知道它们已经被更改,因此绑定也不会更新。
问题:如何告诉AngularJS“刷新”?
出现原因:在jQuery事件回调中,需要刷新AngularJS的作用域。
解决方法:在jQuery事件回调中调用$scope.$apply();
方法。
参考链接:jimhoskins.com/2012/12/17/angularjs-and-apply.html
注意事项:在指令中,经常看到使用scope而不是$scope的情况。这可能是为了区分在控制器中注入的'$scope'。在控制器中,引用$scope很重要,这样AngularJS才知道要注入哪个依赖项,而在指令的链接函数中,它总是通过顺序传递相同的4个元素,并不需要指定特定的名称(scope、element、attrs、controller)。