5

这是jsfiddle示例我的情况。

首先,这是用接收到的维度创建指令的正确方法吗?然后,每个指令都应该与其他指令隔离。因此我使用的是scope: {}.

问题是调用控制器中的函数..它似乎也没有收到广播..

我确信这是一个微不足道的问题..我是 Angular 的新手 :)

我有一个页面,我在其中使用 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>

控制器:

controller('containerCtrl', function ($scope) {
    $scope.components = [{ id: "c1", width: 100, height: 100 },
                        { id: "c2", width: 200, height: 100 },
                        { id: "c3", width: 300, height: 100 }];

    //in the actual controller I am using a socket provider and doing
    //socket.forward([
    //        'initPage',
    //        'refreshPage'
    //    ], $scope);
    //simulating it with a simple broadcast here..
    $scope.$broadcast("onSomething", "");

    $scope.doSomething = function (data) {
        alert("doing something");
    };
}).

和指令:

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

1 回答 1

16

控制器在链接功能之前执行,因此您的广播发送得太快了。您可以使用以下方法延迟此操作$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: {
    width: '@myWidth',
    height: '@myHeight',
    emitSomething: '&callbk'
},

要将参数传递给该回调/控制器函数,您需要使用正确的语法:scope.localDirectiveName({arg1: ..., arg2: ...}). 在小提琴中,我只使用了一个参数,而是在一个数组中传递了两个参数:

$(element).resizable({
   stop: function (event, ui) {
      scope.emitSomething({data: ["id", "position"]});
   }
});

fiddle

于 2013-08-02T14:03:43.310 回答