Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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
Angularjs 如何在控制器中捕获由指令抛出的事件?_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Angularjs 如何在控制器中捕获由指令抛出的事件?

Angularjs 如何在控制器中捕获由指令抛出的事件?,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我在发送和捕获事件时遇到一些问题 考虑一下这个笨蛋: 如你所见,我有两个控制器和一个指令。指令“存在”于控制器1中。当指令中发生某些事情时,我希望在控制器2中捕获此事件。正如您在plunk中看到的,控制台中没有任何记录;这件事没有引起注意 我也尝试过使用服务。在这个场景中,我在服务上创建了一个方法,当调用这个方法时,我抛出事件。就像在Plunk中一样,我在控制器2中侦听事件,但这也不起作用 归根结底,我想在另一个控制器上调用一个方法。在Plunker中,第二个控制器(SecondControll

我在发送和捕获事件时遇到一些问题

考虑一下这个笨蛋:

如你所见,我有两个控制器和一个指令。指令“存在”于控制器1中。当指令中发生某些事情时,我希望在控制器2中捕获此事件。正如您在plunk中看到的,控制台中没有任何记录;这件事没有引起注意

我也尝试过使用服务。在这个场景中,我在服务上创建了一个方法,当调用这个方法时,我抛出事件。就像在Plunk中一样,我在控制器2中侦听事件,但这也不起作用


归根结底,我想在另一个控制器上调用一个方法。

在Plunker中,第二个控制器(
SecondController
)已注册,但从未实际初始化。这就是为什么你的监听器从不记录事件

不清楚您使用第二个控制器的方式、地点和时间,但如果您使用ng view(通过路由)或ng controller对其进行初始化,则其侦听器将观察到该事件


在Plunker中,第二个控制器(
SecondController
)已注册,但从未实际初始化。这就是为什么你的监听器从不记录事件

不清楚您使用第二个控制器的方式、地点和时间,但如果您使用ng view(通过路由)或ng controller对其进行初始化,则其侦听器将观察到该事件


每次访问路线时,都会(重新)创建关联的控制器(和$scope)

由于您提到控制器2与一条路由相关联,因此它仅在您访问该路由时存在(正如@Ajay和@Studie已经提到的),因此您无法在该控制器中捕获事件

我建议您使用一些API/方法创建服务,以执行以下操作:

  • 记录触发的事件
  • 检查事件是否已触发
  • 清除事件
您的指令将调用该方法来记录触发器。
控制器2在创建时会调用check方法(如果找到触发器集,则可能会调用clear方法)。

每次访问路由时,都会(重新)创建关联的控制器(和$scope)

由于您提到控制器2与一条路由相关联,因此它仅在您访问该路由时存在(正如@Ajay和@Studie已经提到的),因此您无法在该控制器中捕获事件

我建议您使用一些API/方法创建服务,以执行以下操作:

  • 记录触发的事件
  • 检查事件是否已触发
  • 清除事件
您的指令将调用该方法来记录触发器。
控制器2在创建时会调用check方法(如果找到触发器集,则可能会调用clear方法)。

谢谢您的回复。我在我的路线中注册了控制器2(我无法让plunker使用路线和模板)。但是我的所有控制器都是在路由中配置的。在本例中,我正在查看page1.html(带有控制器1),它作为
foo
指令。foo指令引用foo.hmtl。在foo.html上发生事件时,我希望引发一个事件,并希望在控制器2中捕获该事件,该事件目前不可见(/loaded?),但已在路由中注册。@Ajaybeniwal,对不起,我不明白你的意思。@Ajaybeniwal想说的是,当你使用routeProvider指定将在每个页面上运行的控制器时,唯一加载的控制器是在当前路由下指定的控制器。也就是说,控制器不是一直加载的。如果路由
/some/route
定义为使用
SomeController
,则只有当该路由处于活动状态时才会加载
SomeController
。感谢您的回复。我在我的路线中注册了控制器2(我无法让plunker使用路线和模板)。但是我的所有控制器都是在路由中配置的。在本例中,我正在查看page1.html(带有控制器1),它作为
foo
指令。foo指令引用foo.hmtl。在foo.html上发生事件时,我希望引发一个事件,并希望在控制器2中捕获该事件,该事件目前不可见(/loaded?),但已在路由中注册。@Ajaybeniwal,对不起,我不明白你的意思。@Ajaybeniwal想说的是,当你使用routeProvider指定将在每个页面上运行的控制器时,唯一加载的控制器是在当前路由下指定的控制器。也就是说,控制器不是一直加载的。如果路由
/some/route
定义为使用
SomeController
,则只有当该路由处于活动状态时才会加载
SomeController
。感谢您的回复。如果我理解您的意思是正确的,您建议在控制器2上为服务的变量/属性创建一个$watch?@Martijn,一个$watch只有在检测到更改时才会触发(以及当它首次初始化时)。这可能适用于您的场景,但可能不适用。如果该事件在创建控制器2之前已经触发,则只需在控制器2初始化过程中调用服务上的方法即可确定该事件是否发生。如果事件可能在控制器2存在时发生,那么也使用$watch。在我的场景中,我认为触发事件时控制器2不存在。因此,您建议在控制器2的初始化过程中调用服务上的一个方法来确定事件是否发生。我不知道你这是什么意思。你能再解释一下吗?@Martijn,当然:
函数Ctrl2($scope,'MyService'){if(MyService.eventtrigger()){…}
。很抱歉,我无法让它工作。我创建了一个带有变量(triggered)和