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