Я использую angular-bootstrap $ modal, и у меня проблема с пониманием того, как обмениваться данными между контроллером и модальным окном.

Контроллер:

app.controller 'MainController', ($scope, $templateCache) ->      
  $scope.openModal = ->
    modal = $modal.open(
      template: $templateCache.get('modal.html')
      controller: modalController
      size: 'sm'
      resolve:
        repository: ->
          $scope.repository
    )

Модального:

modalController = ($scope, $modalInstance, repository) ->
  $scope.repository = repository

  $scope.update = (other_repo) ->
    $scope.repository = other_repo  
    $modalInstance.dismiss('cancel')

На этом этапе я ожидаю, что $scope.repository из MainController будет обновляться при изменении модального окна, но это не так.

Что мне не хватает?

Спасибо

0
Gregory 31 Июл 2014 в 01:21

2 ответа

Лучший ответ

Модальный контроллер имеет область, отличную от контроллера, открывшего модальное окно. Чтобы вернуть некоторые данные из диалогового окна после его закрытия, вы должны получить их из обещания результата, как показано в примере в документация:

modal = $modal.open(...);

modal.result.then(function (otherRepo) {
  $scope.repository = otherRepo;
}
3
JB Nizet 30 Июл 2014 в 22:02

Если вы не передаете область действия контроллера в $ modal, она создаст новую, прототипически унаследованную от $ rootScope: var modalScope = (modalOptions.scope || $rootScope).$new();, и от этого нет связи с областью контроллера открывателя. Но вы можете перейти в модальную область контроллера, которая его откроет:

  $scope.open = function (size) {
    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      size: size,
      scope: $scope
    });

На этот раз область видимости в ModalInstanceCtrl унаследует область родительского контроллера, и все изменения будут отражены в области действия открывающего контроллера.

Посмотрите на этот плункер (это немного измененный образец из Bootstrap-UI) Объект selected из области открывания обновлен в модальном режиме, и это обновление сразу же отражается в поле зрения контроллера ModalDemoCtrl.

1
Yuriy Rozhovetskiy 30 Июл 2014 в 21:54