2016-07-13 2 views
0

AngularJS에서 $modal의 일부 값을 업데이트하려고하지만 어떻게 할 수 있는지 이해할 수 없습니다. 샘플 코드는 다음과 같습니다 :

var modalInstance; 

    function setupCall(data) { 

    var templateURL = 'partials/Chat.html'; 
    var cssClass = 'medium-Modal'; 
    modalInstance = $modal.open({ 
     backdrop: "static", 
     keyboard: false, 
     backdropClick: false, 
     windowClass: cssClass, 
     templateUrl: templateURL, 
     controller: function ($scope, $modalInstance) { 


      $scope.updateStatus=function() { 
      ... 
      } 
     } 
    }); 
    modalInstance.result.then(function() { 

    }); 
} 
// first time i call this function to open model 
setupCall(event); 

이제 때 성공적으로 개방 모델과 나는 서비스에서 일부 업데이 트를받은 나는 다시 내가 모델 외부에서 updateStatus()를 호출하는 방법을 다음 모델에 업데이트 된 값을 표시합니다. modalInstance.updateStatus(..)을 사용하려고 시도했지만 작동하지 않습니다. 누군가 이걸 할 수있는 적절한 방법을 말해 줄 수 있습니까?

+1

왜이 모달 컨트롤러 안에 서비스를 삽입 할 수 없습니까? –

+0

당신이하려는 것을 명확히하지 않습니다. 데이터가 서비스중인 경우 전체 앱에서 서비스 바인딩 업데이트가 아닌 이유는 무엇입니까? – charlietfl

답변

0

당신은 $modalscope 옵션을 통과 한 다음 그 메소드를 호출하는 $broadcast을 사용할 수 있습니다 AngularJS와 이벤트

var modalScope = $rootScope.$new(); 

myService.doSomethingAsync(function (data) { 
    $rootScope.$emit('some event', data); 
}); 

$modal.open({ 
    scope: modalScope, 
    controller: function ($scope) { 

    /* ... */ 

    $scope.$on('some event', function() { 
     $scope.updateStatus(); 
    }); 
    } 
}); 
+0

@lso 글쎄, 이미 $ rootScope. $ emit ('')을 사용하려고 생각하지만 적절한 방법이 아닌 것 같습니다. 모델을 사용하여 맞춤 이벤트 수신기를 연결할 수 있습니까? –

+0

네, 원하는 이벤트 리스너를 사용할 수 있습니다. 그러나'$ rootScope. $ emit'은'$ rootScope' ('$ emit'가 올라가고'$ rootScope'가 가장 높습니다)에서만 청취자를 방아쇠를 당길 것이기 때문에 부풀려진 것이나 다른 것 (' $ rootScope. $ broadcast', 아래와 각 범위를 통과) – Iso

0

를 사용할 수 있습니다. 당신이 (당신이 setupCall 전화 또는 모달을 시작하는)보기의 컨트롤러의 서비스에서 업데이트를받은 후 예를 들어, 다음을 수행하십시오

$rootScope.$broadcast("dataUpdatedFoo", {newData: "bar")); 

이제 모달의 컨트롤러 내부에,이 청취자를 등록 :

$scope.$on("dataUpdatedFoo", function(e, data) { 
    $scope.updateStatus(); 
}); 
+0

브로드 캐스트가 제대로 작동하려면 모달 컨트롤러가 활성화되어야합니다. 이 경우에는 작동하지 않습니다 –

+0

방금'$ rootScope'를 통해 브로드 캐스팅하여 답변을 업데이트했습니다. –

0

모두에게 감사드립니다. 나는 사용자 정의 eventlistener를 추가하여이 문제를 해결합니다.

var listeners = []; 

function _addEventListener(listener) { 
    listeners.push(listener); 
    return listener; 
} 

function _removeListener(listener) { 
    for (var i=0; i < listeners.length; i++){ 
     if (listeners[i] === listener){ 
      listeners.splice(i, 1); 
      break; 
     } 
    } 
} 
function setupCall(data) { 
    ...... 
    modalInstance = $modal.open({ 
     backdrop: "static", 
     keyboard: false, 
     backdropClick: false, 
     windowClass: cssClass, 
     templateUrl: templateURL, 
     controller: function ($scope, $modalInstance) { 

      var listener = _addEventListener(function (event) { 
       $log.info("chat msg: "+JSON.stringify(event)); 
      }); 

      $scope.$on('destroy', function() { 
       _removeListener(listener) 
      }); 
      ...