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_Angularjs Scope - Fatal编程技术网

Javascript 如何访问Angularjs控制器中其他文件(非控制器)中定义的函数?

Javascript 如何访问Angularjs控制器中其他文件(非控制器)中定义的函数?,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我知道这似乎是一个愚蠢的问题,但我这里有一个场景 我有一个javascript文件,它使用three.js来呈现一些模型。 此文件需要一个后端库,但我的WebGL呈现在前端,因此我使用Browsefiy将我自己的代码和后端库组合到一个名为script.js的js文件中 我想在controllers.js中定义的控制器中触发script.js文件中的init函数(仅在用户单击某个按钮后才进行渲染)。 我知道angularJs的控制器似乎与外部代码隔离,但我找不到解决问题的好方法 因为一旦我浏览了包

我知道这似乎是一个愚蠢的问题,但我这里有一个场景

我有一个javascript文件,它使用three.js来呈现一些模型。 此文件需要一个后端库,但我的WebGL呈现在前端,因此我使用Browsefiy将我自己的代码和后端库组合到一个名为script.js的js文件中

我想在controllers.js中定义的控制器中触发script.js文件中的init函数(仅在用户单击某个按钮后才进行渲染)。 我知道angularJs的控制器似乎与外部代码隔离,但我找不到解决问题的好方法

因为一旦我浏览了包含后端库的代码,它就会将400行渲染代码转换为2500多行代码,并且不可能在单个控制器中编写

有什么好办法解决这个问题吗?我将非常感谢任何建议或想法!谢谢

<head>
<---This are the angular files I need->
<script src="./lib/angular/angular.min.js"></script>
<script src="./lib/angular-route/angular-route.min.js"></script>
<script src="./js/app.js"></script>    
<script src="./js/controllers.js"></script>
<script src="./js/services.js"></script>

<--the followings are the rendering files I need--> 
<script src="lib/third-party/threejs/three.min.js"></script>
<script src="lib/third-party/threejs/StereoEffect.js"></script>
<script src="lib/third-party/threejs/DeviceOrientationControls.js"></script>
<script src="lib/third-party/threejs/OrbitControls.js"></script>
<script src="./js/script.js"></script>
</head>

更新 我发布了我的script.js。它相当长,所以我希望我可以通过找出如何以一种简单的方式访问内部的init函数来解决这个问题。谢谢


如果控制器中存在父子关系,则可以使用

$scope.$parent.<anything>
如果您使用的是ES6-

module.exports = {
    <function_to_export_1>,
    <function_to_export_2>,
    ....
};
module.exports={
,
,
....
};

您也可以使用
窗口将函数设置为全局函数。
但这会污染全局作用域,因此不建议这样做。

尝试将第三方文件移到您的文件上方?如果第三方内容没有通过Angular注入,则您可以通过全局作用域访问它
window.threejs()
或他们公开的任何内容。@Phil嗨,对不起,我不确定你指的是什么。最后一个文件script.js是我在Browserify之后得到的文件。所有的第三方代码都在上面。你好@Stephen,谢谢你的回复。Three.js似乎是在窗口下注册的。它使用module.exports=THREE,在我的script.js文件中,我可以使用renderer=new THREE.WebGLRenderer()等语法访问它;但问题是我的init函数没有注册在window对象下。无法在controller.js文件中访问它。我尝试了module.exports,但由于script.js包含一个后端库,因此它也有几行module.exportsLook命令将库包装成指令。如果它执行DOM操作或修改视图,那么工作应该在指令中完成。控制器只需将任何数据绑定到作用域上,就可以将其传递到最终使用第三方库来操作DOM的指令中。这将确保可以在没有DOM的情况下测试angular中的控制器和任何提供程序,并且可以测试指令如何创建/操作DOM对象。对不起,你好像误解了我的问题。我的script.js文件中的函数与控制器无关。在这种情况下,您可以将模块中的函数导出为IIFE,或者将其设置为全局函数(请不要)。您现在可以轻松访问它
module.exports = {
    <function_to_export_1>,
    <function_to_export_2>,
    ....
};