AngularJS指令绑定具有多个参数的函数


72

我在将控制器中定义的函数与指令中的回调函数绑定时遇到一些麻烦。我的代码如下所示:

在我的控制器中:

$scope.handleDrop = function ( elementId, file ) {
    console.log( 'handleDrop called' );
}

然后我的指令:

.directive( 'myDirective', function () {
    return {
      scope: {
        onDrop: '&'
      },
      link: function(scope, elem, attrs) {
        var myFile, elemId = [...]

        scope.onDrop(elemId, myFile);
      }
    } );

在我的html页面中:

<my-directive on-drop="handleDrop"></my-directive>

上面的代码没有运气。根据我在各种教程中所读的内容,我知道我应该在HTML页面中指定参数?

Answers:


84

您的代码中有一个小错误,请尝试以下代码,它应该对您有用

<!doctype html>
<html ng-app="test">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js"></script>

  </head>
 <body ng-controller="test" >    


<!-- tabs -->
<div my-directive on-drop="handleDrop(elementId,file)"></div>

 <script>
     var app = angular.module('test', []);

     app.directive('myDirective', function () {
         return {
             scope: {
                 onDrop: '&'
             },
             link: function (scope, elem, attrs) {
                 var elementId = 123;
                 var file = 124;
                 scope.onDrop({elementId:'123',file:'125'});

             }
         }
     });

     app.controller('test', function ($scope) {
         alert("inside test");
         $scope.handleDrop = function (elementId, file) {
             alert(file);
         }
     });

   </script>
</body>


</html>

2
Angular文档中在哪里定义了此行为?
尼克·拉德福德

1
似乎没有实际的文档主题,但该主题是指令的链接功能docs.angularjs.org/guide/directive
tommybananas 2014年

3
显然,参数名称必须与标记完全匹配;我想知道这是否能幸免于难?
TrueWill

@TrueWill我认为AngularJS完全无法与传统的缩小方法兼容,但是它确实具有执行相同功能的ngmin模块
Joseph Paterson

3
@JosephPaterson根据网页,不赞成使用ngmin,而建议使用ng-annotate。谢谢!
TrueWill

123

可替代的方法

保留您的html:

<my-directive on-drop="handleDrop"></my-directive>

将呼叫更改为:

scope.onDrop()('123','125')

请注意为赋予了额外的开头和结尾括号onDrop。这将实例化函数,而不是注入函数的代码。

为什么更好

  1. 更改handleDrop()定义中的参数名称(如果正确处理,甚至添加更多名称)都不会使您更改html中的每个指令注入。很多干燥器。

  2. 正如@TrueWill所建议的那样,我几乎可以肯定其他解决方案不会在缩小中幸免,而这种方式使代码保持最大的灵活性,并且与名称无关。

另一个个人原因是对象语法,这使我编写了更多代码:

functionName({xName: x, yName: y}) // (and adding the function signature in every directive call)

相对于

functionName()(x,y) // (zero maintenance to your html)

我在这里找到了一个很好的解决方案。


这也对我有用,但是在使用对象表示法时遇到了问题。在Typescript中明确使用类。此评论帮助我解决了问题。
贾斯汀·博伊森

这可行。通过执行Joe的操作,我收到“ TypeError:无法使用'in'运算符在y中搜索x”。
nilloc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.