Javascript ng repeat中的访问特定控制器

Javascript ng repeat中的访问特定控制器,javascript,angularjs,Javascript,Angularjs,我有如下代码: my指令的每个实例都有一个控制器,我想将其公开给父范围。许多指南都说要将my directive的控制器注入父作用域,但调用对my directive内部ng repeat的每个实例都有影响的方法不会对其产生影响吗?我希望对我的指令的每个实例都有特定的控制权 在实际应用程序中,该指令是一个相当大的模块,用于在页面上部署来自多家供应商的视频。不同的供应商有不同的方法名称,如play、playVideo,等等。该指令将这些差异抽象为标准接口,并接受init数据、要加载的视频id等。

我有如下代码:

my指令的每个实例都有一个控制器,我想将其公开给父范围。许多指南都说要将
my directive
的控制器注入父作用域,但调用对
my directive
内部
ng repeat
的每个实例都有影响的方法不会对其产生影响吗?我希望对我的指令的每个实例都有特定的控制权


在实际应用程序中,该指令是一个相当大的模块,用于在页面上部署来自多家供应商的视频。不同的供应商有不同的方法名称,如
play
playVideo
,等等。该指令将这些差异抽象为标准接口,并接受init数据、要加载的视频id等。我正在寻找从父控制器调用这些标准接口方法的方法。下面的例子(使用plunkr)是真实事物控制流的一个非常简化的版本

我现在的做法是:

(my directive.js)

(mypage.html)

(my page controller.js)

data[someIndex].controller.doStuff()

这样做有什么问题吗?有更好的办法吗


编辑

我将
$broadcast
一条带有索引值的消息,当指令控制器收到消息时,特定控制器将知道消息是否已发送给它

(my page controller.js)

(my directive.js)


我将
$broadcast
一条带有索引值的消息,当指令控制器接收到消息时,特定控制器将知道消息是否已发送给它

(my page controller.js)

(my directive.js)


你能添加plunkr吗?我不确定我是否理解这个实现的意义。您将模型对象的值作为字符串传递给指令(使用
@
),然后通过后门进入指令以调用一个函数,该函数会更改该指令的值,从而使指令与数据模型持有的实际值进一步断开。你想从中得到什么?例如,如果你多次点击该按钮,你就是将该值(3、6、12、24等)复合乘以。如果数组中索引3处的值发生更改,则该值不会反映在指令的值中。在实际应用程序中,该指令是一个相当大的模块,可以在页面上部署来自多家供应商的视频。不同的供应商有不同的方法名称,如
play
playVideo
等。该指令将这些差异抽象为标准接口。我正在寻找一种方法来调用指令中的
play
方法。那么这就是你的问题,而不是你想要的这个精心设计的XY用例……你能添加plunkr吗?我不确定我是否理解这个实现的意义。您将模型对象的值作为字符串传递给指令(使用
@
),然后通过后门进入指令以调用一个函数,该函数会更改该指令的值,从而使指令与数据模型持有的实际值进一步断开。你想从中得到什么?例如,如果你多次点击该按钮,你就是将该值(3、6、12、24等)复合乘以。如果数组中索引3处的值发生更改,则该值不会反映在指令的值中。在实际应用程序中,该指令是一个相当大的模块,可以在页面上部署来自多家供应商的视频。不同的供应商有不同的方法名称,如
play
playVideo
等。该指令将这些差异抽象为标准接口。我正在寻找一种在指令中调用这个
play
方法的方法。那么这就是你的问题,而不是这个你不想要的用例的人为XY示例……是的,这绝对是一种方法,尽管它看起来有点迂回。一个缺点是,如果
ng repeat
一起使用,或者在页面的其他地方不使用它(就像我的情况一样),那么
索引
值将丢失。你必须逐步向广播添加更多的跟踪值,以确保它达到正确的指令。嗯,我现在明白了。我以为你的父控制器总是有索引的。我不认为你这样做是不好的,但我也看不到另一种方法…是的,这肯定是一种方法,尽管它看起来有点迂回。一个缺点是,如果
既与
ng repeat
一起使用,也与页面上其他地方的
一起使用(就像我的情况一样),
索引
值丢失。你必须逐步向广播添加更多的跟踪值,以确保它达到正确的指令。嗯,我现在明白了。我以为你的父控制器总是有索引的。我不认为你做这件事的方式不好,但我也看不到另一种方式。。。
link: ($scope, $element, $attr, $ctrl) {
    $scope.controller = $ctrl;
}
$broadcast('doStuff', someIndex);
$on('doStuff', function(index){
if (index == $scope.myDirectiveIndex)
  doStuff();
});