Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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 将外部函数传递到角度指令_Javascript_Angularjs_Function_Directive - Fatal编程技术网

Javascript 将外部函数传递到角度指令

Javascript 将外部函数传递到角度指令,javascript,angularjs,function,directive,Javascript,Angularjs,Function,Directive,我正在努力寻找一种将外部/范围外/非角度函数传递到指令的优雅方式。到目前为止,我能看到的唯一方法是将函数名作为字符串传递到angular中,然后使用eval,这似乎不太好。这是一个关于Plunker的例子 在作用域中使用extFunc:“&”仅适用于作用域中的函数,因此这对我不起作用 有更好的方法吗?我意识到,在我的示例中,只需在指令或控制器中包含函数,但这并不总是实用的 <script> function nonAngularFunction( someText ) {

我正在努力寻找一种将外部/范围外/非角度函数传递到指令的优雅方式。到目前为止,我能看到的唯一方法是将函数名作为字符串传递到angular中,然后使用eval,这似乎不太好。这是一个关于Plunker的例子

在作用域中使用extFunc:“&”仅适用于作用域中的函数,因此这对我不起作用

有更好的方法吗?我意识到,在我的示例中,只需在指令或控制器中包含函数,但这并不总是实用的

<script>
function nonAngularFunction( someText ) {
    alert( someText );
}
<script>

<my-directive ext-func="nonAngularFunction('Hi there')" ></my-directive>

函数非角函数(someText){
警报(someText);
}

很抱歉,如果已经提出了此问题,但我在任何地方都找不到解决方案。

我会将此函数作为服务导入Angular的世界:

/* global nonAngularFunction:false */
angular.module('aModuleName', [])
    .value('nonAngularFunction', nonAngularFunction);
然后,您可以使用注入并将函数导入到您的作用域:

// ... in your directive or controller
angular.module('maybeAnotherModule', ['aModuleName'])
    .controller('YourController', ['$scope', 'nonAngularFunction',
        function ($scope, nonAngularFunction) {

            $scope.nonAngularFunction = nonAngularFunction;
        }]);
应该有用(我还没有测试过)

编辑:当有几十个外部功能时的备选方案

eval
不是一个实用的解决方案,因为它无法访问您的作用域

您可以将大量函数导入Angular,例如

angular.module('aModuleName', [])
    .value('myHorribleLib', {
        'oneFunction': oneFunction,
        'Constructor1': Constructor1,
        ...
    });
然后您必须通过
$scope.legacyLib=myhorblelib
使它们可用,并将其与前缀一起使用:
ng click=“legacyLib.oneFunction('hello')”
。有点罗嗦,但你要注意什么是遗产

或者您只需使用以下方法扩展
$rootScope
(或顶级范围):

angular.module('aModuleName', [])
    .run(['$rootScope', '$window', function ($rootScope, $window) {
        'oneFunction Constructor1 anotherFunction ...'
           .split(' ').forEach(function (f) {
               $rootScope[f] = $window[f];
           });
    }]);

我并不是说这是一个超级干净的解决方案,但通过这种方式,您可以将遗留库的函数公开给Angular scope。它们现在应该在正常的
ng单击
等模式下工作,并可以访问您的范围。

问题是我希望此指令在站点中可重用。angular代码将取代旧的DevExpress(这在任何意义上都是可怕的)控件。有很多现有的javascript(非角度的)需要处理,在旧控件的所有使用中都是不同的。我需要传入触发器和回调函数。理想情况下,这将直接进入指令HTML,而不需要修改应用程序或指令代码。您有没有找到解决方案?