Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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 使$scope在非角度函数中可用_Javascript_Angularjs - Fatal编程技术网

Javascript 使$scope在非角度函数中可用

Javascript 使$scope在非角度函数中可用,javascript,angularjs,Javascript,Angularjs,我有一个通用的非角度JS函数的实用程序文件。我试图想出一个主意,将当前作用域注入该文件中的函数中。 我有以下功能,可以与$state提供程序配合使用: function goToState(state) { angular.element(document).injector().invoke(function ($state) { $state.go(state); }); } 但同样的事情不适用于作用域。我还尝试将$scope转换为字符串以发送到函数: var scopeStr

我有一个通用的非角度JS函数的实用程序文件。我试图想出一个主意,将当前作用域注入该文件中的函数中。 我有以下功能,可以与$state提供程序配合使用:

function goToState(state) {
angular.element(document).injector().invoke(function ($state) {
    $state.go(state);
  });
}
但同样的事情不适用于作用域。我还尝试将$scope转换为字符串以发送到函数:

var scopeString = JSON.stringify($scope);
但是得到“将循环结构转换为JSON”

还有其他想法吗


感谢

只要在脚本中加载函数,控制器就可以调用它们,对于那些无法从HTML访问的函数,您可以从控制器中调用它们,并向它们传递所需的对象,例如没有JSON的$scope。stringify


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';
    });
}

$scope包含对自身的引用,因此您无法对其进行字符串化。我认为,如果我们知道为什么要将$scope传递到函数中,以及为什么要将其字符串化,那么这个问题可以得到更好的回答。$scope本质上是一个JSON对象,因此可以将其传递到其他函数中。但通常情况下,最好只传入您需要的内容,并使用服务传递数据。我尝试的代码可能如下所示:'',但不起作用。我想传递一个字符串并将其还原回另一端的对象。有什么原因不能将回调函数作为角度控制器的一部分吗?然后可以使用$scope对象作为实际的AngularJS范围。或者您可以直接传入$scope对象,而不进行字符串化。不,这是一种特殊情况。我需要使$scope可用于非角度组件。对-的简单建议是创建一个
ngClick=“ctrlFunction()”
,它将在其中调用您的方法
ctrlFunction(){routeCallBackToController($scope)}
您需要的是我的内容是动态的,不能使用任何ng,除非它被编译到我要做的范围,但在我的情况下不起作用。虽然这肯定是一个好的开始,但我仍然需要回到当前范围。将
$scope.$id
放在属性上如何,然后编写一个递归函数,通过遍历$rootScope中的作用域树来查找该作用域。实际上,我使用了您的$window.ngRootScop想法。对我有用。
function myNonAngularJSFunction() {
    ngRootScope.$apply(function(scope) {
        scope.someValue = 'newValue';
    });
}