在非Angular函数中使$ scope可用

时间:2018-02-21 21:58:17

标签: javascript angularjs

我有一个带有通用非Angular JS函数的实用程序文件。我试图想出一个将当前范围注入该文件中的函数的想法。 我有以下功能,可以与$ state提供程序一起使用:

function goToState(state) {
angular.element(document).injector().invoke(function ($state) {
    $state.go(state);
  });
}

但同样的事情不适用于范围。我也在尝试将$ scope转换为字符串以发送到函数:

var scopeString = JSON.stringify($scope);

但是获得“将循环结构转换为JSON”

还有其他想法吗?

由于

2 个答案:

答案 0 :(得分:1)

AngularJS应用程序中有很多范围对象。如果你需要将一个暴露给非AngularJS代码,请使用$rootScope,这是唯一一个可以指望永远存在的代码。

angular.module("app").run("$rootScope", "$window", function($rootScope, $window) {
    $window.ngRootScope = $rootScope;
});

但请确保在AngularJS代码之外的任何时候使用该范围执行某些操作,并将其包装在$apply()中。

如果你这样做:

function myNonAngularJSFunction() {
    ngRootScope.someValue = 'newValue';
}

AngularJS在下次运行摘要周期之前不会知道该值。

相反,这样做是为了确保AngularJS立即注意并处理新的范围值:

function myNonAngularJSFunction() {
    ngRootScope.$apply(function(scope) {
        scope.someValue = 'newValue';
    });
}

答案 1 :(得分:0)

只要函数加载了脚本,控制器就可以调用它们,对于那些从HTML无法访问的函数,你可以从控制器调用它们并传递它们所需的对象,例如$ scope而不用JSON.stringify
<span ng-click="ctrlCallSpecialFunc()" >

angular.module("app",[]).controller('mainCtrl', function($scope){
      $scope.ctrlCallSpecialFunc = function(){
           scriptFunc($scope);
      }
})

plunkr