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();
});