JSON sorgusu / api çağrısından döndürülen verileri ayrıştırmaya ve kullanmaya çalışırken saçlarımı yırtıyorum. Nerede yanlış yaptığımdan tam olarak emin değilim, günlerdir cevabın etrafında dolaşıp, çeşitli hata kodlarını takip ettiğimi hissediyorum:
"'İterableDiff' kanal destekleyen nesne bulunamıyor"
"Genel TYpe Dizisi bir bağımsız değişken gerektirir"
JSON ayrıştırma Hataları ve eminim diğerleri
Yanlış düzeltme kombinasyonuna sahip olduğumu varsayıyorum.
İşte size sorunların ve aranacak şeylerin bir özeti.
Öncelikle api çağrılarınızın sonucunu kontrol edin, sonuçlarınız bir nesne, bir dizi veya bir dizi nesne biçiminde olabilir.
Çok fazla girmeyeceğim, OP'nin orijinal Hatasının yinelenememe hatası genellikle bir Diziyi değil, bir nesneyi yinelemeye çalışmanızdan kaynaklanır.
Hem dizilerin hem de nesnelerin değişkenlerini gösteren bazı hata ayıklama sonuçlarım burada
Bu nedenle, genellikle JSON sonucumuzu yinelemek istediğimizden, bunun bir Dizi biçiminde olmasını sağlamamız gerekir. Çok sayıda örnek denedim ve belki şimdi bildiğimi bildiğimden bazılarının aslında işe yarayacağını biliyordum, ancak benim kullandığım yaklaşım gerçekten bir pipo uygulamaktı ve kullandığım kod t.888 tarafından gönderildi.
transform(obj: {[key: string]: any}, arg: string) {
if (!obj)
return undefined;
return arg === 'keyval' ?
Object.keys(obj).map((key) => ({ 'key': key, 'value': obj[key] })) :
arg === 'key' ?
Object.keys(obj) :
arg === 'value' ?
Object.keys(obj).map(key => obj[key]) :
null;
Dürüst olmak gerekirse, beni elde eden şeylerden biri hata işleme eksikliğiydi, 'tanımsız dönüş' çağrısını ekleyerek artık beklenmeyen verilerin boruya gönderilmesine izin verdiğimize inanıyorum, ki bu benim durumumda açıkça görülüyordu .
Eğer boruya yönelik bir argümanla uğraşmak istemiyorsanız (ve bakın, çoğu durumda bunun gerekli olduğunu düşünmüyorum), sadece aşağıdakini geri verebilirsiniz
if (!obj)
return undefined;
return Object.keys(obj);
Borunuzu ve bu boruyu kullanan sayfanızı veya bileşeninizi oluşturmayla ilgili bazı notlar
'name_of_my_pipe' bulunamadığıyla ilgili hatalar mı alıyorum
Boru modüllerinin doğru şekilde oluşturulduğundan ve referans verildiğinden emin olmak için CLI'den 'iyonik boru oluştur' komutunu kullanın. mypage.module.ts sayfasına aşağıdakileri eklediğinizden emin olun.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(kendi custom_module'ünüz varsa bunun değişip değişmediğinden emin değilsiniz, bunu custommodule.module.ts'e de eklemeniz gerekebilir)
Sayfanızı yapmak için 'iyonik sayfa oluştur' komutunu kullandıysanız, ancak bu sayfayı ana sayfanız olarak kullanmaya karar verdiyseniz, sayfa referansını app.module.ts'den kaldırmayı unutmayın (işte bu https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Verileri html dosyasında görüntülemenin birkaç yolunun olduğu yanıtları ararken ve farklılıkları açıklayacak kadar anlamıyorum. Belirli senaryolarda birbirini kullanmak daha iyi olabilir.
<ion-item *ngFor="let myPost of posts">
<img src="https://somwhereOnTheInternet/{{myPost.ImageUrl}}"/>
<img src="https://somwhereOnTheInternet/{{posts[myPost].ImageUrl}}"/>
<img [src]="'https://somwhereOnTheInternet/' + myPost.ImageUrl" />
</ion-item>
Ancak, hem değeri hem de anahtarı görüntülememe izin veren şey şuydu:
<ion-list>
<ion-item *ngFor="let myPost of posts | name_of_pip:'optional_Str_Varible'">
<h2>Key Value = {{posts[myPost]}}
<h2>Key Name = {{myPost}} </h2>
</ion-item>
</ion-list>
API çağrısını yapmak için HttpModule'u app.module.ts'ye aktarmanız gerekiyor gibi görünüyor
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
ve aramayı yaptığınız sayfada Http'ye ihtiyacınız var
import {Http} from '@angular/http';
API çağrısı yaparken, alt verilere (dizideki nesneler veya diziler) 2 farklı yoldan erişebiliyor gibi görünüyorsunuz;
ya görüşme sırasında
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
veya verileri yerel değişkeninize atadığınızda
posts: Array<String>;
this.posts = myData['anyChildren'];
(bu değişkenin bir Dizi Dizesi olması gerekip gerekmediğinden emin değilim, ancak şu anda ona sahip olduğum şey bu. Daha genel bir değişken olarak çalışabilir)
Ve son not, dahili JSON kitaplığını kullanmak gerekli değildi, ancak bu 2 çağrıyı bir nesneden bir dizeye veya tam tersine dönüştürmek için kullanışlı bulabilirsiniz.
var stringifiedData = JSON.stringify(this.movies);
console.log("**mResults in Stringify");
console.log(stringifiedData);
var mResults = JSON.parse(<string>stringifiedData);
console.log("**mResults in a JSON");
console.log(mResults);
Umarım bu bilgi derlemesi birine yardımcı olur.