2016-07-13 1 views
0

Я хочу обновить некоторое значение $modal в AngularJS, но не могу понять, как я могу это сделать. Пример кода ниже:

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

Вы можете передать scope возможность $modal, а затем использовать 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

Вы можете использовать $broadcast для вызова этого метода. Например, после того, как вы получили обновление от службы в контроллере вашего зрения (где вы звоните 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) 
      }); 
      ... 

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

  • Нет связанных вопросов^_^