2013-12-17 23 views
9

Tôi đã tạo ra một chỉ thị cho ứng dụng của tôi được đề cập trong những điều sau câu hỏi How do you serve a file for download with AngularJS or Javascript? đang Chỉ là như như dưới đây

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

đây phạm vi. $ Trên được sử dụng, khi tôi gọi sự kiện này qua phạm vi $. $ emit hoặc $ scope. $ broadcast, nó không hoạt động. mã điều khiển của tôi là như dưới đây

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

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

và file html của tôi là như sau

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

Những gì tôi đang làm sai ở đây?

@Edit: Đã thêm đăng ký ($ on) trong giai đoạn biên dịch để tránh việc sử dụng $ timeout trong bộ điều khiển. Here bạn có thể xem ví dụ

Trả lời

7

Tôi nghĩ bộ điều khiển của bạn đang được khởi tạo trước chỉ thị của bạn .. do đó, $on bắt đầu nghe sau khi $emit, $broadcast đã xảy ra.

thấy điều này plunker

mở giao diện điều khiển và bạn có thể thấy khi console.logs xảy ra:

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 

Nếu bạn khởi tạo bộ điều khiển với ng-view hoặc làm Emit/phát sóng sau khi chỉ thị được tạo ra , nó sẽ hoạt động.

+0

tại sao bạn đang thực hiện một .controller trên đối tượng fd được trả về của bạn? – Nikos

+0

fd là giá trị trả về của đối số thứ 2 của hàm chỉ thị, mà chỉ trả về cấu hình chỉ thị. '.controller' thực sự được gọi trên giá trị trả về của' .directive', là tham chiếu đến mô-đun gọi là nó. –

1

một cái gì đó tương tự xảy ra với tôi khi tôi cố gắng để gọi một hàm trong các chỉ thị của một phương thức,

những gì tôi phải làm là để làm cho một sự chậm trễ sau khi tôi thực hiện cuộc gọi để hiển thị các phương thức:

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

Ở đây chúng ta không cần phải cho thời gian làm đối số thứ hai cho $ timeout. Tôi đã chỉnh sửa câu hỏi của mình và thêm phát hiện mới nhất của tôi làm giải pháp trong [fiddle] (https://jsfiddle.net/esy4kLm2/5/) – Kanagu

Các vấn đề liên quan