在不使用"angular.element.scope"的情况下从AngularJs外部更新范围

use*_*116 7 javascript jquery scope angularjs

我希望能够从Angular之外的函数更新Angular中的范围.

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

有没有人知道如何在不使用Angular之外更新范围angular.element(selector).scope

以下是帖子中接受的解决方案:

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

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

.scope()当帖子中的调试数据关闭时,这是一个不起作用的警告:

"根据使用的文档,FYI .scope()要求启用调试数据,但出于速度原因,不建议在生产中使用调试数据.下面的解决方案似乎围绕范围() - rtpHarry 2014年12月5日15:12"

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

AngularJS从js函数外部访问范围

谢谢!

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

$window.FirstCtrlScope = $scope;
Run Code Online (Sandbox Code Playgroud)

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

var scope=window.FirstCtrlScope;
scope.$apply(function () {
      // update the scope
});
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

mil*_*era 1

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

如果您需要与 jQuery 插件(或其他非角度代码)配合,请将其包装到具有明确 API(属性、绑定和回调)的指令中。