У меня очень простое приложение Angular2, работающее локально. Я использую службу для отправки экземпляра объекта в API webservice. API проверяет JSON на схему, а идентификаторы должны быть номерами (т. Е. НЕ цитируется в JSON).Свойство объекта Angular2, введенное как «число», изменяется на строку
Моя проблема заключается в том, что когда я пытаюсь отправить объект в веб-сервис, у моего идентификационного поля есть кавычки вокруг него, даже если он напечатан как число в TypScript.
Поведение наблюдается, только если свойство объекта name
содержит «специальные символы».
Я протестировал и обнаружил, что это не похоже на JSON.stringify, который я использую - см. Код ниже.
Приложение написано на машинописном машинописном документе.
класса Unit:
export class Unit {
id: number; // This is the problem child
name: string; // This is the string that can contain special characters
short: string;
triggers_plural: number;
is_headline: boolean;
}
Метод сохранения:
Мой код для сохранения экземпляра Unit
к WebService:
updateUnit(unit: Unit): Promise<Unit>
{
var objSend = {unit_data: [unit]}; // Webservice expects an array of units
console.log(objSend.unit_data[0].id === 2); // Yields false when ID is 2
console.log(objToReturn); // Logs ID to verify it is 2 when testing
// Code for actual request
return this.http.put(`${this.unitUrl}/${unit.id}`, JSON.stringify(objSend),{headers:this.headers})
.toPromise()
.then(()=> unit)
.catch(this.handleError);
}
При выполнении кода и вызвав метод, консоль будет регистрировать, что идентификатор НЕ равен, когда Unit
объект name
Свойство содержит специальные символы.
Пример без специальных символов (не проблема, идентификатор не является числом):
Пример со специальными символами (ЕЕК Id является строкой!):
Метод updateUnit
вызывается из моего компонента компонента-детали, где вы можете отредактировать блок:
export class UnitDetailComponent implements OnInit {
unit: Unit; // this.unit later on
constructor(
private unitService: UnitService,
private route: ActivatedRoute
){}
ngOnInit(): void
{
this.route.params.forEach((params: Params) => {
let id = +params['id']; // The routing will give id to look for
this.unitService.getUnit(id)
.then(unit => this.unit = unit); // Here the unit is instanciated in the first place
});
}
save(): void
{
this.unitService.updateUnit(this.unit).then(this.goBack); // Here is the call to updateUnit method
}
}
Это связано с входом в шаблоне:
<div *ngIf="unit">
<div>
<label>Edit unit</label>
<div>
<input type="text" [(ngModel)]="unit.name" />
</div>
</div>
<button class="btn btn-default" type="button" (click)="save()">Save</button>
</div>
Может быть, проблема возникает уже тогда, когда данные двухсторонние связывания заполняющего name
собственности, когда вы пишете что-то в <input>
, но я не понять, как может измениться тип id
?
Ссылка на GitHub РЕПО всего проекта: https://github.com/djoike/ng2-cookbook/tree/master-so
Интересный Буг, где делает unit_data взялось? Это уже строка, когда вызывается updateUnit? – worenga
В строке, о которой вы говорите, я просто создаю объект (objSend) с свойством «unit_data», и поэтому он не существует нигде раньше на этой строке. – MOV
, но «единица» (аргумент) происходит откуда-то вправо? ... – worenga