2016-10-04 18 views
5

Tình huống: Tôi đang sử dụng FirebaseObjectObservable để điền mẫu Ionic 2 (rc0) của tôi. mẫu mã:Cách sử dụng đường quan sát có ống Async bên trong chức năng bấm Angular2

<p>{{(course | async)?.description}}</p> 
<button ion-button dark full large (click)="openDeckOnBrowser(course.deckUrl)"> 
    <ion-icon name='cloud-download'></ion-icon> 
    <div>View Deck</div> 
</button> 

Hồ sơ TS là

this.course = this.af.database.object('/bbwLocations/courses/' + courseId); 

this.course là một đối tượng căn cứ hỏa lực quan sát được. Vấn đề là, phần này sẽ không hoạt động: (click) = "openDeckOnBrowser (course.deckUrl). Khi khóa học.deckUrl trống. Tôi không thể chuyển giá trị cho hàm.

Chỉ hacky way I tìm thấy để làm việc xung quanh cho đến nay là thế này:

<button id="{{(course | async)?.deckUrl}}" ion-button dark full large (click)="openDeckOnBrowser($event)"> 
    <ion-icon name='cloud-download'></ion-icon> 
    <div id="{{(course | async)?.deckUrl}}">View Deck</div> 
</button> 

và trên các sự kiện nhấp chuột:

openDeckOnBrowser(event):void { 
    console.log(event); 
    let target = event.target || event.srcElement || event.currentTarget; 
    let idAttr = target.attributes.id; 
    let url = idAttr.nodeValue; 
    console.log (url); 
    } 

Nhưng bất kỳ cách nào chính thức và dễ dàng hơn để tiếp cận này

+0

Bạn có tìm thấy giải pháp nào không? Tôi đang giằng co với điều này. –

Trả lời

1

Chỉ cần đăng ký với thể quan sát được ở bạn mã , Và lưu trữ quá trình chính nó trong các thành phần:

this.af.database.object('/bbwLocations/courses/' + courseId) 
    .subscribe(course => this.course = course); 

Sau đó, trong bạn xem:

<p>{{ course?.description }}</p> 
<button ion-button dark full large (click)="openDeckOnBrowser(course?.deckUrl)"> 

(mặc dù tôi có lẽ sẽ sử dụng ng-nếu và chỉ hiển thị các mô tả và nút một lần khóa học là có sẵn)

+1

Cũng đăng ký với đối tượng đánh bại toàn bộ quan điểm của dự án Firebase Observable. Sử dụng đường ống không đồng bộ để tối ưu hóa mã khi nó đăng ký và hủy đăng ký khi nó được thực hiện. Vì vậy, nó đơn giản hóa rất nhiều mã cho tôi. Với giải pháp của bạn, tôi sẽ cần phải hủy đăng ký khi xem phá hủy và tất cả các công việc làm sạch khác mà ống aysnc có thể không cho tôi. Tôi đang tìm một giải pháp mà tôi thậm chí không cần phải đăng ký theo cách thủ công đối tượng firebase. –

+0

Vâng, chúc may mắn sau đó ... –

6

Trong mẫu của bạn (click)="openDeckOnBrowser(course.deckUrl)" được đánh giá ngay sau khi mẫu được phân tích cú pháp. Bạn không sử dụng đường ống không đồng bộ ở đây, do đó, deckUrl trống. Bạn có thể sửa lỗi này bằng cách thêm một ống async thứ hai:

<p>{{(course|async)?.description}}</p> 
<button ... (click)="openDeckOnBrowser((course|async).deckUrl)">...</button> 

Tuy nhiên, điều này không tốt bằng hai đăng ký sẽ được tạo.

A (tốt hơn) thay thế:

Quan chức docs on the AsyncPipe luôn luôn sử dụng *ngFor để ra một danh sách các mục và không *ngIf để ra một mục duy nhất. Lý do rất đơn giản: chỉ thị *ngIf không cho phép bất kỳ bài tập nào. Nhưng chúng ta có thể làm việc xung quanh hạn chế này:

Mẫu trông như sau:

<div *ngFor="let course of course$|async"> 
    <p>Course: {{course?.name}}</p> 
    <p>Url: {{course?.url}}</p> 
</div> 

Và trong thành phần, chúng tôi sẽ chỉ bản đồ khóa học vào một danh sách của một khóa học duy nhất:

this.getCourse().map(c=>[c]); 

See working Demo in Plunker

+0

Tôi vừa nhận thấy rằng những thay đổi mới nhất của tôi đối với Plunker không được lưu vào ngày hôm qua. Tôi đã sửa nó và bây giờ tất cả đều đúng. –

+0

Tôi đã thử các giải pháp, nhưng nó vẫn còn trở lại trống ... –

+0

[Plunker tham chiếu trong câu trả lời] (http://plnkr.co/edit/seROehx78RV009XjLYy4?p=preview) hoạt động tốt với các khái niệm được trình bày trong câu trả lời . Tôi sẽ rất vui được giúp bạn nếu bạn có thể đăng giải pháp không làm việc của bạn trong một Plunker, vì nếu không tôi không thể đánh giá vị trí của lỗi. –

Các vấn đề liên quan