web-dev-qa-db-fra.com

Passer la portée actuelle à modalInstance lors de l'utilisation de la syntaxe controllerAs

J'utilise la syntaxe controllerAs pour éviter une soupe $ scope dans mes contrôleurs, et j'utilise également ui.bootstrap pour présenter une vue modale.

J'ai besoin d'ouvrir un modalInstace qui partage la même portée que le contrôleur actuel. Lors de l'injection de l'oscilloscope, vous pourriez probablement faire quelque chose comme:

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      scope: $scope
    });

Cependant, comme je n'injecte pas la portée et n'utilise pas la syntaxe controllerAs, cela ne fonctionnera pas.

D'après ce que j'ai trouvé, vous devrez utiliser Resolue pour transmettre les données, mais vous devez les transmettre explicitement via les fonctions. Existe-t-il un moyen de dépasser toute la portée?

Il y a un tas de choses que je dois faire dans le fait que les charges modales et passagères de données semblent exagérées.

Je ne veux pas faire cela, car cela semble désordonné ...

var modalInstance = $modal.open({
  templateUrl: 'myModalContent.html',
  controller: 'ModalInstanceCtrl',
  resolve: {
    user: function() {
        return vm.user;
    },
    something: function() {
        return vm.something;
    },
    blah: function() {
        return blah;
    }
  }
});

De meilleures idées?

12
afterxleep

J'ai besoin d'ouvrir un modalInstace qui partage la même portée que le contrôleur actuel.

Service modal crée une portée héritée . Et

var modalInstance = $uibModal.open({
  templateUrl: 'addEditModal.html',
  scope: $scope
});

n'injecte pas la portée mais spécifie la portée parent pour le contrôleur modal (sinon la portée racine sera utilisée comme parent).

Puisque controllerAs a été utilisé sur le contrôleur parent, le contrôleur modal aura accès à l'objet vm hérité sur sa portée.

15
Estus Flask

Je ne sais pas si j'ai bien compris, mais je l'ai fait fonctionner en passant/injectant les 'controllerAs' actuels dans le paramètre de résolution

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      controller: 'AudioItemAddEditCtrl as vm',
      resolve: {
        parent: function(){
            return vm
        }
    }
    });

Et puis, dans l'AudioItemAddEditCtrl ...

var AudioItemAddEditCtrl = function(parent, AudioItemService, $ModalInstance) {
...
}

Ensuite, je peux utiliser "parent" pour accéder directement à la portée du contrôleur parent.

J'espère que ceci aide quelqu'un d'autre.

8
afterxleep