Это обновленная версия моего исходного вопроса. Я создал форму обратной связи (ff) с текстовым вводом и вводом файла, связанным с [(ngModel)] = "feedback.message" & "feedback.screenshot".Получение правильного форматирования JSON с угловой формы
Консоль дает мне эту ошибку: «JSON.parse: неожиданный конец данных в строке 1 столбца 1 данных JSON» либо из файла ff-service, либо из файла компонента ff-формы.
Моя форма:
<form #f="ngForm" (ngSubmit)="onSubmit(f.value)" >
<div class="modal-body">
<p class="lead-text"><strong>Bel ons</strong> op 0488 020 010</p>
<p><em>of</em></p>
<div class="form-group">
<label for="message">Verzend bericht</label>
<textarea class="form-control" required [(ngModel)]="feedback.message" name="message" #message="ngModel" placeholder="Beschrijf uw vraag, feedback of idee" rows="3" ></textarea>
<div [hidden]="message.valid || message.pristine" class="alert alert-danger">
Geef aub een beschrijving
</div>
<label for="screenshot">Schermafbeelding toevoegen</label>
<input type="file" [(ngModel)]="feedback.screenshot" name="screenshot" #screenshot="ngModel">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuleren</button>
<button type="submit" class="btn btn-default" [disabled]="!f.form.valid" >Verzenden</button>
</div>
</form>
Вот мой файл компонента.
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/common';
import { Feedback } from './feedback';
import { FormService } from './feedback-form.service';
@Component({
selector: 'feedback-form',
templateUrl: 'app/feedback-form.component.html',
providers: [FormService]
})
export class FeedbackFormComponent implements OnInit {
response: string;
value: string;
constructor(private _formService : FormService){ }
public feedback: Feedback;
ngOnInit(){
//initialize form
this.feedback = {
message: '',
screenshot: ''
}
}
submitted = false;
onSubmit(form: Feedback) {
this._formService.sendMail(form)
.subscribe(
response => this.response = response,
error => console.log(error)
)
this.submitted = true;
}
//TODO remove when we are done
get diagnostic(){
return JSON.stringify(this.feedback);
}
}
//https://angular.io/docs/ts/latest/guide/forms.html
мои form.service.ts файл:
import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions, URLSearchParams } from '@angular/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class FormService {
constructor(private _http: Http) {
}
private _mailUrl = 'http://app/form-mailer.php';
sendMail(value: any): Observable<any> {
const body = new URLSearchParams(value);
body.set('message',value.message);
body.set('screenshot',value.screenshot);
let headers = new Headers();
headers.append('Content-Type','application/x-www-form-urlencoded');
headers.append('Accept','application/json');
//headers.append('Access-Control-Allow-Origin','*');
return this._http.post(this._mailUrl, body.toString(), { headers: headers })
.map(res => {
res.json();
console.log();
})
.catch(this.handleError)
}
private handleError (error: any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg); // log to console instead
return Observable.throw(errMsg);
}
}
код сервера на стороне PHP:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Content-Type: application/json');
error_reporting(0);
$formData = json_decode(file_get_contents('php://input'));
foreach ($formData as $key=>$value) {
$_POST[$key]=$value;
}
$formMsg = $_POST['message'];
$formScreenshot = $_POST['screenshot'];
$msg = "Message:\n $formMsg\n Screenshot:\n $formScreenshot";
mail('[email protected]','Feedback',$msg);
echo json_encode($formData);
?>
Спасибо за вашу помощь! Фред
Осторожно, но при добавлении скобок к лямбдам вам нужно что-то вернуть, потому что он только неявно возвращается без скобок -> 'return res.json();' (Не относится к вопросу, просто дружественное напоминание) – rinukkusu
@ user3094909 - обновил мой ответ, чтобы дать дополнительные рекомендации на основе ваших отзывов. –
@DanSimon - спасибо за ваш вклад. большие изменения в коде, я обновил. Надеюсь, теперь все гораздо яснее. – Fred30