Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 指令中的AngularJS ControllerA,多个实例覆盖控制器方法_Javascript_Angularjs - Fatal编程技术网

Javascript 指令中的AngularJS ControllerA,多个实例覆盖控制器方法

Javascript 指令中的AngularJS ControllerA,多个实例覆盖控制器方法,javascript,angularjs,Javascript,Angularjs,我有一个由指令组成的表格。此表单的两个部分在输入字段、选择项和复选框中是相同的。我使用隔离作用域和控制器语法(bindToController=true)发出了一个指令,其中控制器有一个从复选框上的ngChange触发的方法。我的问题是,我在控制器中为其分配“this”的控制器别名被触发两次,每个指令触发一次。第二次通过控制器别名,在我的示例中是“ctrlVm”,被第二个作用域覆盖 复制此问题的更简单指令和控制器是: function myDirective() { var directiv

我有一个由指令组成的表格。此表单的两个部分在输入字段、选择项和复选框中是相同的。我使用隔离作用域和控制器语法(bindToController=true)发出了一个指令,其中控制器有一个从复选框上的ngChange触发的方法。我的问题是,我在控制器中为其分配“this”的控制器别名被触发两次,每个指令触发一次。第二次通过控制器别名,在我的示例中是“ctrlVm”,被第二个作用域覆盖

复制此问题的更简单指令和控制器是:

function myDirective() {
  var directive = {
    restrict: 'AE',
        priority: 100,
        require: 'ngModel',
    scope: {
      boundObject: '=boundObj',
      myArray: '='
    },
    templateUrl: 'myTemplate.html',
    controller: controller,
    controllerAs: 'ctrlVm',
    bindToController: true
  };
  return directive;

  function controller() {
    ctrlVm = this;
    ctrlVm.runTest = runTest;

    function runTest() {
      ctrlVm.myArray.push(ctrlVm.boundObject.first);
    }
  }
}
有关上述代码和html的完整演示,请访问:

我基本上调用了两次指令,并期望它们产生“1”或“2”,这取决于您在哪个框中单击。但是正如您所看到的,第一个控制器被第二个控制器“覆盖”,无论您选中哪个框,它都会触发第二个指令的函数,并向数组中添加一个“2”,无论您单击哪个框

我一整天都在做详尽的搜索,一路上还学到了其他一些东西,但是没有找到与此问题相关的多个引用,这两个引用似乎都意味着需要两个具有不同controllerAs别名的不同指令,或者需要一个接受controllerAs名称变量名的指令。这两种解决方案似乎都需要两种不同的视图,因为我的视图包括controllerAs别名的使用(现在这两种指令的使用方式不同)


那么,有没有办法做到这一点,重用控制器和controllerAs语法,并分别为这两个指令提供示例runTest()函数?谢谢您的帮助。

在控制器中,对于指令,您没有声明变量ctrlVm

因此,改变:

  function controller() {
    ctrlVm = this;
    ctrlVm.runTest = runTest;

    function runTest() {
      ctrlVm.myArray.push(ctrlVm.boundObject.first);
    }
  }
致:


谢谢肖恩,我的同事刚刚也注意到了这一点。显然,我发现使用controllerAs语法的示例没有声明var,因此我认为这是bind语法的一个特例。我把它添加到我的实际代码中,问题就解决了。它从未标记错误,所以我从未捕捉到它。谢谢你的关注。
  function controller() {
    var ctrlVm = this;
    ctrlVm.runTest = runTest;

    function runTest() {
      ctrlVm.myArray.push(ctrlVm.boundObject.first);
    }
  }