2013-12-17 7 views
9

ich eine Richtlinie für meine Anwendung erstellt haben, die in der folgenden Frage How do you serve a file for download with AngularJS or Javascript? Richtlinie Code erwähnt wird, ist, wie wie unter

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

Hier Umfang. $ Auf wird verwendet, wenn ich dieses Ereignis über $ scope. $ emit oder $ scope. $ broadcast anrufe, funktioniert es nicht. Mein Controller-Code ist wie unten

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

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

und meine HTML-Datei ist als unten

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

Was ich hier falsch mache?

@Edit: Die subskribieren ($ on) in der Kompilierphase hinzugefügt, um die Verwendung von $ Timeout im Controller zu vermeiden. Here Sie das Beispiel aussehen kann

Antwort

7

Ich denke, Ihre Controller vor Ihrer Richtlinie wird initialisiert .. so die $on beginnt nach dem $emit hören, geschah $broadcast bereits.

sehen diese plunker

die Konsole öffnen und Sie können sehen, wenn die console.logs passieren:

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 

Wenn Sie den Controller mit ng-view oder tun, um die emit initialisieren/Broadcast, nachdem die Richtlinie erstellt wird , es sollte funktionieren.

+0

Warum machst du einen Controller auf dem zurückgegebenen fd-Objekt? – Nikos

+0

fd ist der Rückgabewert des 2. Arguments der Direktivenfunktion, die nur die Anweisung config zurückgibt. Der '.controller' wird tatsächlich für den Rückgabewert von' .directive' aufgerufen, was eine Referenz auf das Modul ist, das ihn aufgerufen hat. –

1

ähnlich mir etwas passiert, wenn ich eine Funktion in der Richtlinie eines modalen zu nennen versuchen,

, was ich tun musste, war eine Verzögerung zu machen, nachdem ich callte das modale zeigen:

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

Hier müssen wir nicht die Zeit als zweites Argument für $ Timeout angeben. Ich habe meine Frage bearbeitet und meine neueste Erkenntnis als Lösung in [fiddle] hinzugefügt (https://jsfiddle.net/esy4kLm2/5/) – Kanagu

Verwandte Themen