2014-06-12 17 views
7

Sto costruendo un angolare-app con ui-router, dove ho una vista padre e una vista del bambino.passaggio di informazioni da stato a stato bambino genitore in angolare-ui-router

routerApp.config(function($stateProvider, $urlRouterProvider) { 

    $urlRouterProvider.otherwise('/home'); 

    $stateProvider 
     .state('home', { 
      url: '/home', 
      templateUrl: '/views/home/home.html', 
      controller: 'HomeController' 
     }) 
     .state('new-assignment', { 
      url: '/new-assignment', 
      templateUrl: 'new-assignment.html', 
      controller: 'AssignmentController' 
     }) 
      .state('new-assignment.new-client', { 
       url: '/new-client', 
       templateUrl: 'new-client.html', 
       controller: 'ClientController' 
      }) 
    ; 

}); 

La vista del bambino viene utilizzato (tra le altre cose) per creare un nuovo cliente. Quindi, facendo clic su 'crea nuovo cliente' nella vista principale. Lo stato cambia in "new-assignment.new-client" e viene mostrata la vista laterale.

Quando il client viene creata voglio passare di nuovo alla vista primaria 'nuova assegnazione' e passare lungo le informazioni con quanto che si sono appena creato.

La vista padre potrebbe avere ancora i dati in una sua forma (per la creazione di assegnazione) e deve, naturalmente, non essere toccato.

posso rilevare un cambiamento da '$ stateChangeSuccess' evento:

routerApp.controller('AssignmentController', function($scope, Assignment, Client, $log) { 
    $scope.clients = Client.clients; 
    $scope.$on('$stateChangeSuccess', function (e, toState, toParams, fromState, fromParams){ 
     $log.log(fromState.name + ' -> ' + toState.name); 
     $log.log('toParams '); 
     $log.log(toParams); 
     $log.log('fromParams '); 
     $log.log(fromParams); 
    }); 
}); 

ho cercato di passare informazioni attraverso

$state.go('^', data); 

ma senza successo ...

Ma don Comprendere come passare i dati alla vista principale. Qualche idea?

risposta

7

L'ambito vista figlio eredita dall'ambito della vista genitore. Quindi, basta definire l'array $scope.clients[] nello AssignmentController. Quindi aggiungi il nuovo client a quell'array nello ClientController.

Take a look at this Plunker vedere come la vista nested ambiti di ottenere l'accesso al proprio vista primaria ambito.

+0

Vedo il tuo punto, ma non mi piace cambiare le cose nella portata degli altri. Potrebbe diventare molto complicato, soprattutto dal momento che questo aggiornerà specifici elementi di input, ecc. Ho deciso di utilizzare gli eventi per informare sugli aggiornamenti. Vedi la mia risposta. Grazie per il tuo input @ david004 – mraxus

+0

Pensi seriamente che sia meno disordinato? Il framework ha ereditarietà per una ragione. – david004

+1

L'ambito vista stato figlio non eredita dall'ambito della vista stato genitore a meno che la vista stato figlio non sia nidificata nella vista stato genitore. Un esempio in cui le viste non sono nidificate sono le modali. –

3

Rudemente risponderò alla mia domanda.

ho deciso di andare con messaggi di evento:

app.controller('ClientController', function ($scope, $state, ClientService) { 

    $scope.save = function (newClientData) { 
     var ret = ClientService.create(newClientData); 
     if (ret) { 
      // Pass newly created object to parent view. 
      $scope.$emit('clientCreated', newClientData); 
      // Then go to that state (closing child view) 
      $log.log($state); 
      if ($state.current.name === 'new-client') 
       return $state.go('home'); 
      $state.go('^'); 
     } 
    }; 
}); 

app.controller('AssignmentController', function ($scope, Assignment, ClientService) { 
    $scope.clients = ClientService.clients; 

    $scope.$on('clientCreated', function (e, data) { 
     $scope.clientSelected(data); 
    }); 

    $scope.clientSelected = function (client) { 
     $log.log(client); 
     $scope.data.client = client; 
     $scope.data.clientName = client.name; 
     $scope.data.clientId = client.id; 
    } 
}); 

Questo codice è legata al codice nella mia domanda!

+2

È una cattiva idea utilizzare gli eventi, provare a non inserirli nell'app perché potresti finire con una performance terribile. Gli eventi attivano tutti gli ambiti durante la ricerca di ".disponibile gestore eventi". –

0

sì, varie idee.

È possibile inviare le informazioni sui dati utilizzando i parametri di query. Conversione dei dati in JSON e invio in questo modo "$ state.go ('^', data)" e definizione dell'URL di stato con "new-assignmentww /? Data".

Se viene assegnato i dati, è possibile ottenere informazioni e convertire in oggetto nuovo.

Altro, è possibile accedere allo stato genitore utilizzando "$ stato. $ Padre" e assegnare il valore nel controller, quindi è possibile chiamare "$ state.go ('^')".

è anche possibile creare una funzione di callback nel controllore dello Stato genitore e chiamare il controllore dello Stato bambini.

Problemi correlati