Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова
примерно так:
class func getGenres(completionHandler: (genres: NSArray) -> ()) {
...
let task = session.dataTaskWithURL(url) {
data, response, error in
...
resultsArray = results
completionHandler(genres: resultsArray)
}
...
task.resume()
}
, а затем вызвать этот метод:
override func viewDidLoad() {
Bookshop.getGenres {
genres in
println("View Controller: \(genres)")
}
}
Когда вы работаете с формой в Angular, попробуйте получить доступ и работать с данными из директив формы: FormGroup
, FormArray
и т. Д.
В своем коде вы объединили вывод данных из простого массива контактов и попытались смешать его с элементами управления формой.
Создайте группу форм для всей формы правильно, чтобы она соответствовала вашему интерфейсу, затем используйте данные из нее в форме, особенно если у вас есть возможность изменить ее в форме.
Используя formControl
на входах и т. Д., Ваши данные изменяются на вводе пользователем, поэтому вы можете получить их с помощью свойства .value
. Когда вы группируете данные в formGroups, вы можете получить доступ ко всем затем агрегированным данным с помощью formGroup.value
, где будут все созданные вами структура и данные.
Я обновил ваш стек. С частично реализованным, что я сказал. Продолжайте в том же духе, и вы получите поддерживаемый и вполне читаемый код.
[ 1113] Обновление
Пример редактирования адреса в stackblitz: https://stackblitz.com/edit/angular-movie-read-load-json-sample-eg-w9ty9b? файл = SRC / приложение / app.component.html
попробуйте этот онлайн-пример
Я изменил это:
selectAddr(addr) {
this.newAttribute.addressType = addr.addressType;
this.newAttribute.postalCode = addr.postalCode;
this.newAttribute.city = addr.city;
this.selectedAddr = addr;
}
saveAddress(index, form: FormGroup) {
const mode: 'update' | 'add' = this.selectedAddr ? 'update' : 'add';
if (mode === 'add') {
this.contacts[index].addresses.push({ ...this.newAttribute });
} else if (mode === 'update') {
Object.assign(this.selectedAddr, this.newAttribute);
}
// reset
this.selectedAddr = undefined;
form.reset();
}
<div class="main" *ngFor="let contact of contacts;let i = index">
<form [formGroup]="addForm" #myForm>
<p>Name: {{contact.name}}</p>
<br>
<!--Address section-->
<div class="address-sec">
<p id="addr">Addresses</p>
<br>
<table style="width:100%" *ngFor="let addr of contact.addresses">
<tr>
<td>
<div id="field-type">
<mat-chip-list>
<mat-chip color="primary" (click)="selectAddr(addr)" selected>{{addr.addressType}}</mat-chip>
</mat-chip-list>
</div>
</td>
<td>
<div class="field-data">
{{addr.city}}-{{addr.postalCode}}
</div>
</td>
<td>
<div class="field-data">
<b>Delete</b>
</div>
</td>
</tr>
</table>
<hr>
<br>
</div>
<br>
<!--Address Section-->
<mat-form-field>
<mat-select formControlName="addressType" placeholder="Type" [(ngModel)]="newAttribute.addressType">
<mat-option *ngFor="let addressType of addresstypes" [value]="addressType.value">
{{addressType.viewValue}}
</mat-option>
</mat-select>
</mat-form-field>
<br>
<mat-form-field >
<input matInput formControlName="postalCode" [(ngModel)]="newAttribute.postalCode" placeholder="Postal Code" >
</mat-form-field>
<br>
<mat-form-field >
<input matInput formControlName="city" [(ngModel)]="newAttribute.city" placeholder="City" >
</mat-form-field>
<br>
<br><br><br><br>
<button mat-flat-button (click)="saveAddress(i,myForm)">Save</button>
</form>
<br>
<hr>
</div>