2013-12-17 6 views
9

Я создал директиву для моего приложения, которое упоминается в следующем вопросе 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; 
    }); 

Здесь сфера. $ На используется, когда я вызываю это событие через $ 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: добавлена ​​подписка ($ on) на этапе компиляции, чтобы избежать использования $ timeout в контроллере. Here вы можете посмотреть пример

ответ

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/вещать после того, как директива создается , он должен работать.

+0

Почему вы делаете .controller на возвращаемом объекте fd? – Nikos

+0

fd - это возвращаемое значение второго аргумента директивной функции, которая просто возвращает директиву config. '.controller' на самом деле вызывается на возвращаемое значение' .directive', которое является ссылкой на модуль, который его вызвал. –

1

что-то подобное случилось со мной, когда я пытаюсь вызвать функцию в директиве модального,

, что я должен был сделать, чтобы сделать задержку после того, как я сделал вызов, чтобы показать модальный:

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

Здесь нам не нужно указывать время как второй аргумент для $ timeout. Я отредактировал свой вопрос и добавил свой последний вывод в качестве решения в [скрипке] (https://jsfiddle.net/esy4kLm2/5/) – Kanagu

Смежные вопросы