11

Sto usando la sintassi controllerAs per evitare un brodo $ scope nei miei controller e anche usando ui.bootstrap per presentare una vista modale.Passa l'ambito corrente a modalInstance quando si utilizza la sintassi controllerAs

Ho bisogno di aprire un modalInstace che condivide lo stesso ambito del controller corrente. Quando si inietta il campo di applicazione, probabilmente si potrebbe fare qualcosa di simile:

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

Tuttavia, come non sto iniettando il campo di applicazione, e utilizzando la sintassi controllerAs, che non funzionerà.

Da quello che ho trovato, è necessario utilizzare la risoluzione per passare i dati, ma è necessario passarlo esplicitamente tramite le funzioni. C'è un modo per passare l'intero ambito?

C'è un sacco di cose che devo fare in quel modale e il passaggio di carichi di dati sembra eccessivo.

non si vuole fare questo, come sembra disordinato ...

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

un'idea migliore?

risposta

14

Ho bisogno di aprire un modalInstace che condivide lo stesso ambito del controller corrente .

Servizio modale creates inherited scope. E

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

non iniettare il campo di applicazione, ma specifica portata genitore per il controller modale (altrimenti la portata principale sarà utilizzato come il genitore).

Poiché controllerAs è stato utilizzato sul controller padre, il controllore modale avrà accesso all'oggetto ereditato vm sull'ambito.

+1

Questa soluzione richiede di iniettare $ scope al controller. Questo è ciò che cerchiamo di evitare. – Bendim

+0

@Bendim Come detto nella risposta, non inserisce l'ambito ma specifica l'ambito genitore per il controller modale. Può essere un '$ scope' o un scope = $ rootScope. $ New()' di un controller in qualche servizio. '$ uibModal' è stato progettato per funzionare in questo modo. Chi è "noi"? Se hai problemi simili, sentiti libero di postare una domanda che rifletta il tuo caso particolare. – estus

+1

Sembra la metà della risposta. devi quindi inserire $ scope nel controller modale, quindi puoi accedere alle variabili dell'ambito padre come $ scope.controllerasname.variable – nuander

8

Non sono sicuro se ho capito bene, ma ho capito di lavoro passando/iniettando l'attuale 'controllerAs' nel parametro di determinazione

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

E poi, nel AudioItemAddEditCtrl ...

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

Quindi sono in grado di utilizzare 'parent' per accedere direttamente allo scope del controller genitore.

Spero che questo aiuti qualcun altro.