2014-05-14 12 views
10

Sto provando a utilizzare l'interfaccia router per attivare una modale per un determinato stato, piuttosto che modificare l'intera vista. Per fare questo, ho implementato una forma leggermente adattata di what is given in the FAQ, poiché sto usando angular-foundation piuttosto che bootstrap. Quando ho innescare la condizione, il modal è mostrato, tuttavia, cancella anche il punto di vista già esistenti, anche se senza vista sono specificate nel mio stato:Modifiche dell'interfaccia UI-Router delle viste esistenti

.state('selectModal', 
    onEnter: ($modal, $state, $sessionStorage) -> 
    $modal.open(
     templateUrl: 'views/select_modal.html' 
     windowClass: 'tiny' 
     controller: 'SelectCtrl' 
     resolve: 
     options: (Restangular) -> Restangular.all('options').getList() 
    ) 
    .result.then (result) -> 
     $sessionStorage.selected = result 
     $state.go 'resource', id: result.id 
) 

Dovrei configurando viste/i genitori di questo stato per esempio <div ui-view='modal'></div> o parent:'main' (Mi piacerebbe che fosse accessibile da qualsiasi stato senza modificare tale stato quando attivato)?

+0

FAQ Esempio usano '.state ("Items.Add", {})', in modo che quando si attiva 'state items.add',' 'degli articoli non verrà modificata. In il tuo caso ti innesca stato senza genitore, quindi dovresti usare https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views –

+0

Scuse per la risposta tardiva, vedi la mia risposta alla risposta di Joe –

+0

C'è qualche discussione su questo problema https://github.com/angular-ui/ui-rou ter/issues/1014, e ci sono alcune risposte per risolverlo. Ma se non hai troppe visualizzazioni con le modali, ti consiglierei di usare hardcode con alcuni valori 'constant' –

risposta

1

specificare che ha uno stato padre utilizzando "." convenzione di denominazione. (sostituisci "parentState" con il nome del genitore effettivo): .state ('parentState.selectModal', ...

+0

La convenzione di denominazione' .' è semplicemente un altro modo di affermare la relazione genitore-figlio, cambiando quale sintassi viene usata non avere qualche effetto su quella relazione Il vero problema qui è che mi piacerebbe che lo stato avesse il genitore di "ciò che è attivo in questo momento" in modo che il modale ottenga il proprio stato sopra quello attuale. Specificando il genitore di 'main' si rimuoverà qualunque altro stato sia attivo, e semplicemente includendo il collegamento modale nella base per renderlo disponibile globalmente non si consente l'uso degli stati per commutarlo. –

0

Hai pensato di inserire il codice modale in un servizio e di chiamare il servizio in ogni controller che utilizza modale?

angular.module('app').service('modal', function(){ 

    function open(){ 
     $modal.open(
      templateUrl: 'views/select_modal.html', 
      windowClass: 'tiny', 
      controller: 'SelectCtrl', 
      resolve: { 
       options: function(Restangular) { Restangular.all('options').getList() } 
      } 
     ) // .result... if it's generic, otherwise put it in the controller 
    } 
}); 

angular.module('myapp').controller('main', function($scope, modal){ 

    modal.open().result.then(function(result) { 
     $sessionStorage.selected = result; 
     $state.go('resource', id: result.id); 
    }); 

} 
+0

Il nocciolo di questo problema sta cercando di dare al modale il proprio stato sopra quello esistente. La tua soluzione proposta mostrerebbe il modale, ma non spingerebbe su un nuovo stato, ad es. 'risorse' ->' risorse/nuove'. –

+0

Ah, capisco. Questo lo complica. – Trevor

Problemi correlati