Tôi đã xé tóc ra khi cố phân tích cú pháp và sử dụng dữ liệu được trả về từ một cuộc gọi api / api JSON. Tôi không chắc chắn chính xác nơi tôi đã sai, tôi cảm thấy như tôi đã khoanh tròn câu trả lời trong nhiều ngày, theo đuổi các mã lỗi khác nhau như:
"Không thể tìm thấy đối tượng hỗ trợ đường ống 'iterableDiff'"
"Mảng TYpe chung yêu cầu một (các) đối số"
Lỗi phân tích cú pháp JSON và tôi chắc chắn những người khác
Tôi giả sử tôi chỉ có sự kết hợp sai của các bản sửa lỗi.
Vì vậy, đây là một chút tóm tắt về gotchas và những thứ cần tìm.
Trước hết hãy kiểm tra kết quả của các cuộc gọi api của bạn, kết quả của bạn có thể ở dạng một đối tượng, một mảng hoặc một mảng các đối tượng.
Tôi sẽ không tham gia vào nó quá nhiều, đủ để nói rằng Lỗi ban đầu của OP không thể lặp lại được nói chung là do bạn cố gắng lặp lại một đối tượng, không phải là một mảng.
Đây là một số kết quả gỡ lỗi của tôi hiển thị các biến của cả mảng và đối tượng
Vì vậy, như chúng ta thường muốn lặp lại kết quả JSON của mình, chúng ta cần đảm bảo nó ở dạng Mảng. Tôi đã thử rất nhiều ví dụ, và có lẽ biết những gì tôi biết bây giờ một số trong số đó sẽ thực sự hoạt động, nhưng cách tiếp cận tôi thực hiện là thực hiện một đường ống và mã tôi đã sử dụng là đăng bởi 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;
Thành thật tôi nghĩ rằng một trong những điều khiến tôi gặp phải là thiếu xử lý lỗi, bằng cách thêm cuộc gọi 'trả lại không xác định' tôi tin rằng chúng tôi hiện đang cho phép dữ liệu không mong đợi được gửi đến đường ống, điều này rõ ràng đã xảy ra trong trường hợp của tôi .
nếu bạn không muốn giải quyết tranh luận với đường ống (và xem tôi không nghĩ rằng nó cần thiết trong hầu hết các trường hợp), bạn có thể trả lại như sau
if (!obj)
return undefined;
return Object.keys(obj);
Một số lưu ý khi tạo đường ống và trang hoặc thành phần sử dụng đường ống đó
là tôi đã nhận được lỗi về 'name_of_my_pipe' không được tìm thấy
Sử dụng lệnh 'ion tạo ống' từ CLI để đảm bảo các mô-đun ống.ts được tạo và được tham chiếu chính xác. đảm bảo bạn thêm phần sau vào trang mypage.module.ts.
import { PipesModule } from ‘…/…/pipes/pipes.module’;
(không chắc chắn nếu điều này thay đổi nếu bạn cũng có custom_module của riêng mình, bạn cũng có thể cần phải thêm nó vào mã hóa đơn hàng hóa.module.ts)
nếu bạn đã sử dụng lệnh 'ionic tạo trang' để tạo trang của mình, nhưng quyết định sử dụng trang đó làm trang chính của bạn, hãy nhớ xóa tham chiếu trang khỏi app.module.ts (đây là câu trả lời khác tôi đã đăng khi xử lý https: / /forum.ionicframework.com/t/solve-pipe-not-found-in-custom-component/95179/13?u=dreaser
Trong quá trình tìm kiếm câu trả lời của tôi, trong đó có một số cách để hiển thị dữ liệu trong tệp html và tôi không hiểu đủ để giải thích sự khác biệt. Bạn có thể thấy tốt hơn khi sử dụng cái này trong cái khác trong những tình huống nhất định.
<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>
Tuy nhiên, những gì đã làm việc cho phép tôi hiển thị cả giá trị và khóa là như sau:
<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>
để thực hiện lệnh gọi API, có vẻ như bạn cần nhập httpModule vào app.module.ts
import { HttpModule } from '@angular/http';
.
.
imports: [
BrowserModule,
HttpModule,
và bạn cần http trong trang bạn thực hiện cuộc gọi từ
import {Http} from '@angular/http';
Khi thực hiện cuộc gọi API, bạn dường như có thể truy cập dữ liệu con (các đối tượng hoặc mảng trong mảng) theo 2 cách khác nhau, dường như đều hoạt động
hoặc trong suốt cuộc gọi
this.http.get('https://SomeWebsiteWithAPI').map(res => res.json().anyChildren.OrSubChildren).subscribe(
myData => {
hoặc khi bạn gán dữ liệu cho biến cục bộ của bạn
posts: Array<String>;
this.posts = myData['anyChildren'];
(không chắc chắn nếu biến đó có phải là Chuỗi Array hay không, nhưng đó là những gì tôi có bây giờ. Nó có thể hoạt động như một biến chung hơn)
Và lưu ý cuối cùng, không cần thiết phải sử dụng thư viện JSON sẵn có, tuy nhiên bạn có thể thấy 2 cuộc gọi này có ích để chuyển đổi từ một đối tượng sang chuỗi và ngược lại
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);
Tôi hy vọng việc tổng hợp thông tin này sẽ giúp được ai đó.