这是我原来的问题的更新版本。 我创建了一个带有文本输入和文件输入的反馈表单(ff),绑定了[(ngModel)] =“feedback.message”&“feedback.screenshot”。从一个角度获取正确的JSON格式
控制台给我提供了这个错误“JSON.parse:JSON数据的第1行第1列的数据的意外结束” 可能来自ff-service或ff-form组件文件。
我的形式:
<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);
?>
感谢您的帮助! 弗雷德
小心,虽然为lambda表达式添加了括号,但你必须返回一些东西,因为它只隐含地返回没有括号 - >'return res.json();'(与问题无关,只是友好的提醒) – rinukkusu
@ user3094909 - 更新了我的回答,以根据您的反馈提供进一步的指导。 –
@丹西蒙 - 感谢您的输入。代码的巨大变化,我更新了。希望一切现在更清楚。 – Fred30