Wyrywałem sobie włosy, próbując przeanalizować i wykorzystać dane zwrócone z zapytania JSON / wywołania API. Nie jestem pewien, dokąd poszedłem źle, czuję, że krążyłem odpowiedź od dni, ścigając różne kody błędów, takie jak:
„Nie można znaleźć obiektu obsługującego potok„ iterableDiff ””
„Ogólna tablica typu wymaga jednego argumentu (ów)”
Błędy analizy JSON i jestem pewien, że inni
Zakładam, że po prostu miałem niewłaściwą kombinację poprawek.
Oto krótkie podsumowanie problemów i rzeczy, na które należy zwrócić uwagę.
Najpierw sprawdź wynik wywołań interfejsu API, wyniki mogą mieć postać obiektu, tablicy lub tablicy obiektów.
nie będę się w to zbytnio zagłębiał, wystarczy powiedzieć, że pierwotny błąd OP, że nie jest iterowalny, jest generalnie spowodowany próbą iteracji obiektu, a nie tablicy.
Oto niektóre z moich wyników debugowania pokazujących zmienne zarówno tablic, jak i obiektów
Ponieważ generalnie chcielibyśmy iterować nasz wynik JSON, musimy upewnić się, że ma on postać tablicy. Wypróbowałem wiele przykładów i być może wiedząc, co teraz wiem, niektóre z nich faktycznie zadziałałyby, ale podejście, które zastosowałem, polegało na zaimplementowaniu potoku, a kod, którego użyłem, był taki, że opublikowany przez t.888
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;
Szczerze mówiąc, myślę, że jedną z rzeczy, które mnie dopadły, był brak obsługi błędów, dodając wywołanie `` return undefined ''. Myślę, że teraz pozwalamy na wysyłanie niespodziewanych danych do potoku, co oczywiście miało miejsce w moim przypadku .
jeśli nie chcesz zajmować się argumentem do potoku (i nie sądzę, że jest to konieczne w większości przypadków), możesz po prostu zwrócić następujące polecenie
if (!obj)
return undefined;
return Object.keys(obj);
Kilka uwag na temat tworzenia rury i strony lub komponentu używającego tej rury
czy otrzymywałem błędy dotyczące nie znalezienia „name_of_my_pipe”
Użyj polecenia „ionic generowanie potoku” w interfejsie wiersza polecenia, aby upewnić się, że moduły potokowe. upewnij się, że dodałeś następujące elementy do strony mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(nie jestem pewien, czy to się zmieni, jeśli masz również własny moduł niestandardowy, może być konieczne dodanie go do custommodule.module.ts)
jeśli użyłeś polecenia „jonowa generuj stronę”, aby utworzyć swoją stronę, ale zdecydujesz się użyć tej strony jako strony głównej, pamiętaj, aby usunąć odwołanie do strony z app.module.ts (oto kolejna odpowiedź, którą opublikowałem, dotyczącą tego https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
W moich poszukiwaniach odpowiedzi, gdzie jest wiele sposobów wyświetlania danych w pliku html i nie rozumiem wystarczająco, aby wyjaśnić różnice. W niektórych scenariuszach może się okazać, że lepiej jest używać jednego nad drugim.
<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>
Jednak to, co zadziałało, pozwoliło mi wyświetlić zarówno wartość, jak i klucz, było następujące:
<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>
aby wywołać API, wygląda na to, że musisz zaimportować HttpModule do app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
i potrzebujesz Http na stronie, z której dzwonisz
import {Http} from '@angular/http';
Podczas wykonywania wywołania API wydaje się, że jesteś w stanie dostać się do danych podrzędnych (obiektów lub tablic w tablicy) na 2 różne sposoby, które wydają się działać
albo podczas rozmowy
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
lub kiedy przypisujesz dane do zmiennej lokalnej
posts: Array<String>;
this.posts = myData['anyChildren'];
(nie jestem pewien, czy ta zmienna musi być ciągiem tablicy, ale to jest to, co mam teraz. Może działać jako zmienna bardziej ogólna)
I ostatnia uwaga, nie było konieczne korzystanie z wbudowanej biblioteki JSON, jednak te 2 wywołania mogą być przydatne do konwersji z obiektu na ciąg i odwrotnie
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);
Mam nadzieję, że ta kompilacja informacji komuś pomoże.