从AngularJS中的隔离作用域/指令接收广播并调用控制器函数?
以下是我的例子 首先,这是使用收到的维度创建指令的正确方法吗? 然后,每个指令都应该与其他指令隔离。。因此,我使用的是从AngularJS中的隔离作用域/指令接收广播并调用控制器函数?,angularjs,angularjs-scope,directive,Angularjs,Angularjs Scope,Directive,以下是我的例子 首先,这是使用收到的维度创建指令的正确方法吗? 然后,每个指令都应该与其他指令隔离。。因此,我使用的是范围:{} 问题在于调用控制器中的函数。。而且它似乎也没有收到广播 我相信这是一个微不足道的问题。。我是新来的:) 我有一个页面,其中我加载了许多带有ng repeat的组件: <div ng-app="test"> <div ng-controller="containerCtrl"> <component ng-repea
范围:{}
问题在于调用控制器中的函数。。而且它似乎也没有收到广播
我相信这是一个微不足道的问题。。我是新来的:)
我有一个页面,其中我加载了许多带有ng repeat的组件:
<div ng-app="test">
<div ng-controller="containerCtrl">
<component ng-repeat='c in components' id="c.id" my-width="{{c.width}}" my-height="{{c.height}}">
</div>
</div>
以及该指令:
directive('component', function () {
var linkFn = function(scope, element, attrs) {
$(element).
resizable({
stop: function( event, ui ) {
scope.emitSomething(attrs.id, ui.position);
}
});
scope.$on('onSomething', function(res) {
alert("onSomething!");
});
};
return {
restrict: 'E',
template: '<div class="ui-widget-content" style="width: {{width}}px; height: {{height}}px;"></div>',
replace: true,
scope: {
width:'@myWidth',
height:'@myHeight'
},
link : linkFn
};
});
scope: {
width: '@myWidth',
height: '@myHeight',
emitSomething: '&callbk'
},
指令('component',函数(){
var linkFn=函数(范围、元素、属性){
$(元素)。
可调整大小({
停止:功能(事件、用户界面){
作用域(attrs.id、ui.position);
}
});
作用域:$on('onSomething',函数(res){
警惕(“在某物上!”);
});
};
返回{
限制:'E',
模板:“”,
替换:正确,
范围:{
宽度:“@myWidth”,
高度:“@myHeight”
},
链接:linkFn
};
});
控制器在链接功能之前执行,因此您的广播发送得太早。您可以使用
$timeout
延迟此操作:
$timeout(function() {
$scope.$broadcast("onSomething", "");
});
要从具有隔离作用域的指令调用控制器方法,需要将该方法指定为参数:
<component ng-repeat='c in components' id="c.id" my-width="{{c.width}}"
my-height="{{c.height}}" callbk="doSomething(data)">
要将参数传递给回调/控制器函数,需要使用正确的语法:scope.localDirectiveName({arg1:…,arg2:…})
。在fiddle中,我只使用了一个参数,并在数组中传递了两个参数:
$(element).resizable({
stop: function (event, ui) {
scope.emitSomething({data: ["id", "position"]});
}
});
太好了,谢谢:)这是一个正在工作的JSFIDLE。如果说标签中声明的函数是控制器内部的函数,而另一个函数是获取
{data:}的函数,是否正确
是指令作用域的功能吗?我有一个类似的问题…控制器的广播不会在指令中触发我的事件…超时有时会解决这个问题,但并不总是…而且,应用程序相当繁重,我不想依赖时间总是会解决它的事实…还有其他方法吗?@ackuser,也许你可以让你的指令向控制器发送一个初始的“我还活着”事件,让控制器等到收到所有需要的通知后再广播。好的一点,我没有想过…这似乎是一个很好的解决方案,虽然我认为应该有一个简单的方法来实现这一点,比如在指令中的优先级,或者说在控制器加载之前请帮我这样做。我的意思是,现在我需要放一个新的广播或发射,说“嗨,我在这里”,然后再获得一美元,我在其中再次广播..仍然是角度方面的初学者..无论如何thx;)+1.
$(element).resizable({
stop: function (event, ui) {
scope.emitSomething({data: ["id", "position"]});
}
});