从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"]});
   }
});