2017-01-31 8 views
0

ファイルをアップロードするためにng-file-uploadを使用している指令を使用しています。この指令は、メインコントローラから呼び出されるモーダルウィンドウに含まれています。私はメインコントローラから$ rootScope。$ broadcastイベントを呼び出し、そのイベントをディレクティブでlistenしています。ユーザーがモーダルを2回(またはそれ以上)開いたときに問題が発生した場合、呼び出された各ディレクティブのディレクティブスコープは破棄されず、スコープ内で2回進みます。指令スコープが破壊されていません

モーダルビュー

<div class="dup-group-doc2 col-md-9" data-ng-if="carvm.isEdit"> 
    <upload-document add-button="true" delete-button="false" review-obj="carvm.review" document-types="carvm.documentTypes" agencies="carvm.agenciesByReview" module="'CAR'" show-upload-button="false" show-add-button="true" event="carvm.event">> 
    </upload-document> 
</div> 

メインコントローラ

 function openImpModal(isMultiple, isEdit, finding, eventId, event) { 
      followupvm.isMultiple = isMultiple || false; 
      followupvm.isEdit = isEdit || false; 
      followupvm.finding = finding; 
      followupvm.eventId = eventId; 
      followupvm.impModalInstance = $uibModal.open({ 
       animation: true, 
       size: 'lg', 
       templateUrl: "src/app/modules/planning/views/modals/implementation.modal.view.html", 
       controller: 'ImplementationModalController as impvm', 
       backdrop: 'static', 
       keyboard: false 
      }); 

      followupvm.impModalInstance.result.then(function(selectedItem) { 

       if (selectedItem.object !== {}) { 
         $rootScope.$broadcast('callDirective', object); 
       } 
      } 
}); 

指令ビュー

<div class="form-group row"> 
         <label for="customDocName" class="col-md-4 control-label text-right">Document Name:</label> 
         <input type="text" class="col-md-3" id="customDocName" placeholder="Name document (optional)" data-ng-model="reviewObj.docObj.docName" data-ng-change="onChange()"> 
         <input ng-if="!isEdit" type="file" class="col-md-5" ngf-select ng-model="$parent.docFile" name="file" ngf-max-size="5MB" required value="Choose File" ngf-model-invalid="errorFile" validfile> 
        </div> 

指令コントローラ

(function() { 
    'use strict'; 

    angular 
     .module('planning') 
     .directive('uploadDocument', uploadDocument); 

    uploadDocument.$inject = ['DocumentService', 'Upload', 'configParams', '$timeout', '$rootScope', 'CommentService']; 

    /* @ngInject */ 
    function uploadDocument(DocumentService, Upload, configParams, $timeout, $rootScope, CommentService) { 
     var directive = { 
      link: link, 
      restrict: 'AE' 
      scope: { 
       index: "@?", 
       addButton: "=?", 
       loggedUser: "=", 
       deleteButton: "=?", 
       reviewObj: "=?", 
       documentTypes: "=", 
       agencies: "=?", 
       module: "=", 
       event: "=?", 
       showUploadButton: "=?", 
       showAddButton: "=?", 
       isEdit: "=?", 
       fileObj: "=?" 
      }, 
      templateUrl: 'src/app/modules/planning/directives/document-upload/documentUpload.view.html' 
     }; 
     return directive; 

     function link(scope, element, attrs) { 

      scope.reviewObj.docObj = {}; 
      scope.docFile = {}; 
      scope.reviewObj.docObj.restricted = false; 
      scope.showPreviousComments = false; 
      scope.documentTypeRequired = false; 
      scope.objectAdded = false; 

      scope.uploadClicked = false; 

      /* istanbul ignore if */ 
      if (scope.isEdit) { 
       scope.reviewObj.docObj.docName = scope.fileObj.documents.documentName; 
       if (scope.reviewObj.docObj.docName === 'undefined') { 
        scope.reviewObj.docObj.docName = ''; 
       } 
       scope.reviewObj.docObj.restricted = scope.fileObj.documents.restricted; 
       scope.reviewObj.docObj.selectedDoc = scope.fileObj.documents.refDocTypeId; 
       scope.reviewObj.docObj.previousComments = scope.fileObj.comments; 
      } 
      scope.uploadDoc = function(file, newEvent) { 
       // code for uploading document     
      }; 

      $rootScope.$on('callDirective', function(event, object) { 
        **// If I open same modal twice second time when $rootScope event is send it will go twice to this $on event** 
       if (scope.module === object.moduleName) { 
        if (!scope.objectAdded) { 
         scope.eventModule = object.moduleName; 
         scope.event = object.event; 
         scope.findingsIdList = object.findingsIdList; 
         scope.reviewObj.docObj = object.uploadObject; 
         scope.objectAdded = true; 
         scope.uploadDoc(object.fileToUpload, true); 
        } 
       } 
      }); 
     } 
    } 
})(); 

答えて

0

私はあなたのディレクティブが破壊されているかどうかを言うことはできませんが、あなたの現在のコードで、あなたのリスナーは、とにかくスコープで破壊されません。

$rootScope.$on('callDirective', function(event, object) { ... }); 

この行は、登録解除機能を返します。スコープが破壊されたときに使用する必要があります。

var unregister = $rootScope.$on('callDirective', function(event, object) { ... }); 

scope.$on('$destroy', unregister); 
+0

私はあなたを理解しているかどうかはわかりません。破壊メソッドが呼び出されたときにどのように使用するのですか?私はメインコントローラからこの$を呼んでいます。スコープを持つあなたの命題で$ on( '$ destroy'、unregister); $ ONの中に決して入ることはありません。 – Bukic

関連する問題