74

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

在我的控制器中:

$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 页面中指定参数?

4

2 回答 2

125

可以在缩小后幸存的替代方法

保持您的 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)

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

于 2014-10-07T20:22:35.260 回答
87

您的代码中有一个小错误,请尝试下面的代码,它应该适合您

<!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>
于 2013-09-24T06:01:07.293 回答