javascript - 指令中的 ng-click 不调用 Controller 范围中定义的函数

标签 javascript angularjs

一切似乎都正确渲染,但当我单击四个按钮之一时,我的 ng-click="check($event)" 没有触发。我什至向 check($event) 函数添加了一个警报,但它没有出现。这是代码笔 http://codepen.io/theMugician/pen/MKOzzV?editors=101

simonApp.directive('pads', ['lightIt', 'soundIt', function(lightIt,soundIt) {
    var template = '';
  template += '<button ng-click="check($event)" id=' + '{{index}} ' + 'class="pad pad-' + '{{color}}' + '">';
  template += '<div class="ripple js-ripple">';
  template += '<span class="ripple-circle ' + 'ripple-' + '{{color}}' + '"></span></div>';
  template += '</button>';
  return {
    restrict: 'E',
    replace: true,
    scope: {
      color: '@color',
      index: '@index'
    },
    link: function(scope, element, attrs) {
      scope.createRipple = function(e){
        lightIt.createRipple(e, this);
      } 
      //scope.$emit('index', scope.index);
      /*
      var index = parseInt(scope.index);
      scope.playSound = function() {
        soundIt(1);
      }*/
      console.log("scope.index: " + scope.index);
      //console.log("scope.playSound: " + scope.playSound);

      element.on('click', scope.createRipple);
      //element.on('animationend', scope.endRipple);
    },
    template: template
  };
  }]);

这是 Controller 中的check()函数

  $scope.check = function(e) {
    alert("check works");
    var id = e.currentTarget.id; 
    if($scope.init){
      if(sequence[turn] === id){
        turn++;
        if(turn === sequence.length){
          $scope.step++;
          setTimeout(function(){
            newRound();
          }, 1000);
        }
      }else{
        if($scope.isStrict){
          setTimeout(function(){
            alert('game over');
          $scope.reset();  
          }, 300);
        }else{
          $scope.displaySeq(sequence);
        }
      }  
    } 
  }

最佳答案

您不能像这样从指令调用 Controller 方法。

如果您需要范围隔离,则必须使用表达式绑定(bind)(“&”范围参数)或一起关闭范围隔离(从指令定义中删除 scope 键)

查看优秀video来自 John Lindquist 的使用范围表达式绑定(bind)的示例。

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

    app.directive("pads", function() {
    return {
        restrict: "E",
        scope: {
            check: "&"
        },
        template: '<div class="button" ng-click="check({message: value})">click</div></div>',
        link: function(scope) {
          scope.value = 'message to controller'
        }
    };
    });

    app.controller('myCtrl', function() {

       this.doCheck = function(message) {
         alert(message) // alerts "message to controller"
 
       }

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

<div ng-app='app' ng-controller='myCtrl as ctrl'>
    <pads check="ctrl.doCheck(message)"></pads>
</div>

关于javascript - 指令中的 ng-click 不调用 Controller 范围中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906692/

相关文章:

javascript - 您如何获得 JavaScript 对象定义以在控制台中提供自定义输出?

Javascript 对象 forEach 如何?

javascript - 为什么在 Angular 中通过 $parse 分配设置值时不触发scope.$watch?

javascript - 如何从 Controller 返回总计到 <td> 标签 Angular JS

javascript - 使用 var self = 这是在类和事件之间同步的好方法吗?

angularjs - 单击wav链接时打开Audacity

javascript - 如何在 dat.gui 控件中隐藏显示文件夹?

javascript - jQuery:用最短的时间完成处理程序

javascript - Worklight - 打开 native 应用程序

javascript - 将模型绑定(bind)到选定的值,而不是在项目上选择设置