Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我怎么能告诉AngularJS“去”;刷新“;_Javascript_Angularjs - Fatal编程技术网

Javascript 我怎么能告诉AngularJS“去”;刷新“;

Javascript 我怎么能告诉AngularJS“去”;刷新“;,javascript,angularjs,Javascript,Angularjs,我有一个click事件发生在自定义指令的范围之外,因此我没有使用“ng click”属性,而是使用jQuery.click()侦听器并在我的范围内调用函数,如下所示: $('html').click(function(e) { scope.close(); ); close()是一个简单的函数,如下所示: scope.close = function() { scope.isOpen = false; } <div ng-show="isOpen">My Div</

我有一个click事件发生在自定义指令的范围之外,因此我没有使用“ng click”属性,而是使用jQuery.click()侦听器并在我的范围内调用函数,如下所示:

$('html').click(function(e) {
  scope.close();
);
close()是一个简单的函数,如下所示:

scope.close = function() {
  scope.isOpen = false;
}
<div ng-show="isOpen">My Div</div>
在我看来,我有一个元素“ng show”绑定到isOpen,如下所示:

scope.close = function() {
  scope.isOpen = false;
}
<div ng-show="isOpen">My Div</div>
我的Div

调试时,我发现正在调用close(),isOpen被更新为false,但AngularJS视图没有更新。有没有办法手动告诉Angular更新视图?或者有没有一种更“角度”的方法来解决我没有看到的问题?

解决方案是调用

$scope.$apply();
…在我的jQuery事件回调中。

使用

$route.reload();
记住将
$route
注入控制器

为什么要调用
$apply
TL;博士: 无论何时,只要您想在角度世界的外部应用所做的更改,都应该调用
$apply


为了更新,这里解释了它到底做了什么以及为什么起作用

$apply()
用于从外部执行AngularJS中的表达式 AngularJS框架。(例如,从浏览器DOM事件, setTimeout、XHR或第三方库)。因为我们正在召唤 我们需要AngularJS框架来执行适当的范围生命周期

角度允许将任何值用作绑定目标。然后在任何JavaScript代码循环结束时,它检查值是否已更改。 检查任何绑定值是否已更改的步骤实际上有一个方法,
$scope.$digest()
。我们几乎从不直接调用它,因为我们使用
$scope.$apply()
(它将调用
$scope.$digest


Angular仅监视表达式中使用的变量以及
$watch
范围内的任何内容。因此,如果您在Angular上下文之外更改模型,则需要调用
$scope.$apply()
来传播这些更改,否则Angular将不知道它们已更改,因此绑定将不会更新。

我认为此链接将非常有用。这不应该是
$scope.$apply()?您可以同时使用$scope或scope,这只是一个符号差异,但结果是相同的。@ErichBSchulz-通常在指令中,我看到使用的scope没有使用$,我相信这可能会区分它和注入控制器的“$scope”。在控制器中,按$scope引用很重要,这样Angular就知道要注入什么依赖项,而在指令链接函数中,它总是按顺序传递相同的4个元素,并且不需要特定的名称(scope、element、attrs、controller)。此外,在使用ui路由器时,请确保使用
$state.reload()
这对我们的屏幕截图测试非常有帮助!我们模拟状态,但有时不一定有观察者来观察变化,这可能导致混乱的故障或间歇性故障。但是能够像这样重新加载示波器有助于解决这个问题。