范围。$ on在指令内创建时不起作用

时间:2013-12-17 07:15:56

标签: angularjs events broadcast directive emit

我已为我的应用程序创建了一个指令,该指令在以下问题中提到 How do you serve a file for download with AngularJS or Javascript?指令代码如下所示

    appModule.directive('fileDownload', function ($compile) {
        var fd = {
            restrict: 'A',
            link: function (scope, iElement, iAttrs) {

                scope.$on("downloadFile", function (e, url) {
                    var iFrame = iElement.find("iframe");
                    if (!(iFrame && iFrame.length > 0)) {
                        iFrame = $("<iframe style='position:fixed;display:none;top:-1px;left:-1px;'/>");
                        iElement.append(iFrame);
                    }
                    iFrame.attr("src", url);
                });
            }
        };
        return fd;
    });

这里使用了。$ on,当我通过$ scope。$ emit或$ scope。$ broadcast调用此事件时,它无效。我的控制器代码如下所示

    function reportsController($scope, $http) {
        var self = this;

        $scope.$broadcast("downloadFile", 'http://google.com');
        $scope.$emit("downloadFile", 'http://google.com');
    }

我的html文件如下

    <div ng-controller="reportsController" id="repctrl">
        <a file-download></a>
    </div>

我在这里做错了什么?

@Edit:在编译阶段添加了subscribe($ on),以避免在控制器中使用$ timeout。 Here您可以查看示例

2 个答案:

答案 0 :(得分:7)

我认为你的控制器正在你的指令之前被初始化..所以$on$emit$broadcast已经发生之后开始倾听。

请参阅此plunker

打开控制台,您可以看到console.logs何时发生:

controller init happened script.js:16
link happened script.js:7
$scope.test() happened script.js:21
scope.$on happened script.js:9
scope.$on happened 

如果使用ng-view初始化控制器或在创建指令后执行emit / broadcast,它应该可以工作。

答案 1 :(得分:1)

当我尝试在模态指令中调用函数时,发生了类似的事情,

我必须做的是在我打电话后显示模态后延迟:

        $timeout(function () {
            $rootScope.$broadcast('obtiene-plantillas');
        }, 500);