从AngularJs外部更新作用域,而不使用angular.element.scope"

Updating scope from outside AngularJs without using "angular.element.scope"

本文关键字:element angular scope quot 外部 AngularJs 更新 作用域      更新时间:2023-09-26

我希望能够从Angular外部的函数中更新Angular中的作用域。

。,如果我有一个jQuery插件返回一个成功回调,我希望能够从成功回调更新范围。我看到的每个解决方案都涉及调用angular.element(selector).scope,然后在返回的作用域上调用$apply。然而,我也看到许多评论表明,当调试信息关闭时,这不起作用,因此不建议这样做,但我还没有看到任何替代解决方案。

有没有人知道从Angular外部更新作用域而不使用angular.element(selector).scope的方法?

以下是文章中接受的解决方案:

"如果你想从AngularJs控制之外对范围值进行任何更改,如jQuery/javascript事件处理程序,你需要使用$scope.$apply()

function change() {
    alert("a");
    var scope = angular.element($("#outer")).scope();
    scope.$apply(function(){
        scope.msg = 'Superhero';
    });
}

这是一个警告,.scope()不工作时,调试数据关闭后:

"根据文档,使用.scope()需要启用调试数据,但由于速度原因,不建议在生产中使用调试数据。下面的解决方案似乎围绕着scope() - rtharry Dec 5 '14 at 15:12 "

在这篇文章或其他类似的文章中,我没有看到任何替代使用。scope()的解决方案。

AngularJS从外部js函数访问作用域

谢谢!

不使用angular.element(selector).scope的一个可能的解决方案是我在使用FirstCtrl的窗口对象的控制器中分配范围。我将$window注入FirstCtrl控制器,并做了以下操作:

$window.FirstCtrlScope = $scope;

然后从jQuery或其他javascript我可以做:

var scope=window.FirstCtrlScope;
scope.$apply(function () {
      // update the scope
});

这是一个很好的解决方案,还是有更好的解决方案来更新一个范围,而不使用angular.element(selector).scope ?

谢谢!

我认为这两种方式都不好。将控制器设置为全局变量的设计,或者通过html元素访问作用域的设计,会导致带有许多隐藏链接的应用程序无法维护。

如果你需要配合jQuery插件(或其他非angular代码),把它包装成带有清晰API(属性、绑定和回调)的指令。

您可以将范围分配给元素上的数据属性,然后访问该属性。看看angular-ui-bootstrap库在哪里实现了这种方法。