2016-01-17 17 views
17

Ora l'invio è stato rilevato da angular2 anche con action = nel formato < >.Come inviare il modulo al server in Angular2

collegamento

demo: http://plnkr.co/edit/4wpTwN0iCPeublhNumT5?p=preview

//our root app component 
import {Component} from 'angular2/core' 

@Component({ 
    selector: 'my-app', 
    providers: [], 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
     <form action="https://www.google.com" target="_blank" method="POST"> 
     <input name="q" value="test"> 
     <button type="submit">Search</button> 
     </form> 
    </div> 
    `, 
    directives: [] 
}) 
export class App { 
    constructor() { 
    this.name = 'Angular2' 
    } 
} 
+3

La registrazione di un modulo causa direttamente il ricaricamento di una pagina, che di solito non è ciò che si desidera in un'applicazione Angolare (SPA). Prendi i dati dal modulo e invia una richiesta HTTP dal tuo codice al server. –

+1

Con 'target =" _ blank "' il post dovrebbe essere in una nuova pagina. E l'azione in realtà punta a un dominio diverso, quindi xhr non è un'opzione. –

+0

Vedo. Hai ragione. –

risposta

45

Si dovrebbe sfruttare la direttiva NgSubmit, come descritto di seguito:

<form (ngSubmit)="onSubmit()" #heroForm="ngForm"> 
    (...) 
    <input type="text" [(ngModel)]="data.name"/> 
    (...) 
    <button type="submit">Send</button> 
</form> 

In questo caso, quando si fa clic sul pulsante di invio, il metodo della onSubmit verrà chiamato il componente e sarà possibile inviare manualmente i dati al server utilizzando la classe HTTP su Angular2:

@Component({ 
}) 
export class MyComponent { 
    constructor(private http:Http) { 
    this.data = { 
     name: 'some name' 
     (...) 
    }; 
    } 

    onSubmit() { 
    this.http.post('http://someurl', JSON.stringify(this.data)) 
     .subscribe(...); 
    } 
} 

In questo modo è possibile rimanere nella stessa pagina.

Modifica

Seguendo il tuo commento, è necessario disattivare il comportamento della direttiva NgForm che cattura l'evento submit e impedisce che venga propagato. Vedi questa riga: https://github.com/angular/angular/blob/master/modules/%40angular/forms/src/directives/ng_form.ts#L141.

Per fare che è sufficiente aggiungere l'attributo ngNoForm al modulo:

<form ngNoForm action="https://www.google.com" target="_blank" method="POST"> 
    <input name="q" value="test"> 
    <button type="submit">Search</button> 
</form> 

In questo caso, una nuova finestra sarà aperta per vostro modulo di presentazione.

Spero che ti aiuta, Thierry

+0

Come ho detto nel commento sopra. ngSubmit non è quello che voglio. Voglio solo aprire una nuova finestra con i dati del post. –

+1

Mi spiace di non aver capito il tuo problema ... Usa l'attributo 'ngNoForm' per il tuo modulo. Ho aggiornato la mia risposta ;-) –

+0

Complimenti! Ero in esecuzione per lo stesso problema, in cui il mio modulo (avvolgendo un pulsante di invio per disconnettersi dalla mia applicazione) non era in esecuzione. Ho passato un'ora a esaminare il mio markup prima di fare clic sul fatto che potesse trattarsi di una cosa specifica per Angular2. Dropped nell'attributo ngNoForm e boom! Successo! Grazie mille! –

1

Hey, se qualcuno altro ha mai qualche problema fastidioso in Firefox quando la pubblicazione di un modulo per un nuovo URL causa un aggiornamento della pagina e non segue la pagina aggiungi target="_parent" e risolverà il problema.

Problemi correlati