自定义ng-enter指令不将$ event从html传递给控制器

时间:2017-09-12 13:05:33

标签: javascript angularjs angularjs-directive

我正在使用一个自定义指令来检测用户何时按Enter键,然后调用周围表单元素的ngSubmit 中调用的相同函数。

下面是我的问题的演示,我需要从控制器内访问该事件,但它总是未定义的。

以前有人有这个问题吗?有什么问题?为什么会这样? refs的链接和解释一样好。

是否有更好的方法可以重复两次方法调用? (次级)



var app = angular.module('app', []);

app.controller('submitCtrl', ['$scope', function($scope) {

  $scope.submitContent = function(event) {
    //This is what I am looking for.
    console.log(event); //This is undefined. 
  }
}]);

app.directive('mvEnter', function() {
  return function(scope, element, attrs) {
    element.bind('keydown keypress', function(event) {
      if (event.which === 13) {
        scope.$apply(function() {
          scope.$eval(attrs.mvEnter);
        });
        event.preventDefault();
      }
    });
  };
});

<!DOCTYPE html>
<html>
<head></head>

<body ng-app='app'>
  <div ng-controller="submitCtrl">
    <textarea mv-enter="submitContent($event);"></textarea>
  </div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</body>

</html>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

$eval方法看起来像$scope.$eval(expr, locals),这意味着您可以使用locals函数的$eval对象,其中键将是参数名称({{ 1}})。

$event

Preview

答案 1 :(得分:2)

我改变了一些你的代码片段。看看,告诉我们这是否适合您! :)

说明:$ scope.eval,作为函数的名称,计算您传递的表达式。如果表达式是函数的原型,则该方法将返回您评估的函数,以便您可以执行它。所以,你有执行的功能和你想要的参数,所以... 1 + 1 = 2 jajajajaja。

我希望这有助于你。如果您有任何疑问,请询问:)

var app = angular.module('app', []);

app.controller('submitCtrl', ['$scope', function($scope) {

  $scope.submitContent = function(event) {
    //This is what I am looking for.
    console.log(event); //This is undefined. 
  }
}]);

app.directive('mvEnter', function() {
  return function(scope, element, attrs) {
    element.bind('keydown keypress', function(event) {
      if (event.which === 13) {
        scope.$apply(function() {
          var directiveFunction = scope.$eval(attrs.mvEnter);
          if (angular.isFunction(directiveFunction)) {
            directiveFunction(event);
          }
        });
        event.preventDefault();
      }
    });
  };
});
<!DOCTYPE html>
<html>
<head></head>

<body ng-app='app'>
  <div ng-controller="submitCtrl">
    <textarea mv-enter="submitContent"></textarea>
  </div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</body>

</html>