2016-09-18 6 views
0

У меня очень простое приложение 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

+0

Интересный Буг, где делает unit_data взялось? Это уже строка, когда вызывается updateUnit? – worenga

+0

В строке, о которой вы говорите, я просто создаю объект (objSend) с свойством «unit_data», и поэтому он не существует нигде раньше на этой строке. – MOV

+0

, но «единица» (аргумент) происходит откуда-то вправо? ... – worenga

ответ

0

Небольшое решение является приведение поля к any, а затем преобразовать его в number с помощью parseInt(), я сталкивался с подобной проблемой только сегодня

для получения дополнительной информации о кастинге, проверьте Тип утверждения раздел here