Доступ к свойствам из подписки

#angular #rxjs

#угловатый #rxjs

Вопрос:

У меня возникли проблемы с разработкой того, как получить доступ к свойствам подписки RxJS в проекте angular 2.

Я знаю, что мой сервис работает так, как я могу поставить {{selectedCustomer.name }} в моем шаблоне, и он показывает мне имя, я просто не могу понять, как получить доступ к этому в моем компоненте, чтобы я мог назначить его как часть ngInit.

Если кто-то может помочь в том, как это сделать, буду очень признателен

Обслуживание

 import { Injectable } from '@angular/core';

import { Customer } from "./customer-model";

import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';

import "rxjs/add/operator/filter";

declare var firebase: any;

@Injectable()
export class CustomerService {

    // customer: Customer;
    customer: FirebaseObjectObservable<Customer[]>;
    customers: FirebaseListObservable<Customer[]>;

    constructor(private af: AngularFire) { }

    getCustomers(category: string = null) {
        if (category != null) {
            this.customers = this.af.database.list('customer', {
                query: {
                    orderByChild: 'category',
                    equalTo: category
                }
            });

        } else {

            this.customers = this.af.database.list('customer') as FirebaseListObservable<Customer[]>;

        }

        return this.customers;
    }

    getCustomer(customerIndex: number) {

        this.af.database.object('/customer/'   customerIndex)
            .subscribe(customer => {
                this.customer = customer;
            });
        return this.customer;
    }

    addCustomer(customer: Customer) {

        // Get new unique key for customer
        var customerKey = firebase.database().ref().child('customer').push().key;

        // Create reference to new customer key
        var newCustomer = {};
        newCustomer['/customer/'   customerKey] = customer;

        return firebase.database().ref().update(newCustomer);
    }

    deleteCustomer(customerIndex: number) {
         this.af.database.object('/customer/'   customerIndex).remove();
    }

}
 

Шаблон

     <form [formGroup]="myForm" (ngSubmit)="onAddCustomer()">
  <md-card class="demo-card demo-basic">
    <md-toolbar color="primary">Edit</md-toolbar>
    <md-card-content>
      <br>
      <table style="width: 100%" cellspacing="0">
        <tr>
          <td>
            <md-input placeholder="Organisation" style="width: 100%" formControlName="name" type="test" id="name" #name></md-input>
          </td>
          <td>
            <md-input placeholder="Description" style="width: 100%" formControlName="description" type="test" id="description" #description></md-input>
          </td>
          <td>
            <md-input placeholder="Image Url" style="width: 100%" formControlName="imagePath" type="test" id="imagePath" #imagePath></md-input>
          </td>
        </tr>

      </table>
    </md-card-content>
  </md-card>

</form>
 

Компонент

 import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators, FormControl } from "@angular/forms";

import { Subscription } from 'rxjs/Rx';

import { FirebaseObjectObservable } from 'angularfire2';

import { Customer } from '../customer-model';
import { CustomerService } from '../customer.service';

@Component({
  selector: 'mj-customer-edit',
  templateUrl: './customer-edit.component.html',
  styleUrls: ['./customer-edit.component.css']
})
export class CustomerEditComponent implements OnInit, OnDestroy {

  myForm: FormGroup;
  error = false;
  errorMessage = '';

  private subscription: Subscription;
  private customerIndex: number;
  selectedCustomer: FirebaseObjectObservable<Customer[]>;

  constructor(
    private fb: FormBuilder,
    private route: ActivatedRoute,
    private customerService: CustomerService,
    private router: Router) { }

  ngOnInit() {

    this.subscription = this.route.params.subscribe((params: any) => {
      this.customerIndex = params['key'];
      this.selectedCustomer = this.customerService.getCustomer(this.customerIndex);
    })
    **This is where I want to assign the values on my form to the customer object that i get back from the service**

    this.myForm = this.fb.group({
      name: ['', Validators.required],
      description: ['', Validators.required],
      imagePath: ['', Validators.required],
    });
  }

  ngOnDestroy(){
    this.subscription.unsubscribe();
  }

}
 

Ответ №1:

Вам также необходимо подписаться на службу поддержки клиентов.

 this.subscription = this.route.params.subscribe((params: any) => {
          this.customerIndex = params['key'];
          this.customerService.getCustomer(this.customerIndex).subscribe((res) => {
              this.selectedCustomer = res;
              //extra assignments with selectedCustomer object here.
          });
        })
 

Редактировать: добавлен код службы

 getCustomer(customerIndex: number) {

    return this.af.database.object('/customer/'   customerIndex);
}
 

Комментарии:

1. Спасибо — если я попытаюсь это сделать, я получу ошибку компиляции, в которой говорится, что тип ‘Customer[]’ не может быть присвоен типу ‘FirebaseObjectObservable<Customer[]>’.

2. Да, извините, это помогло бы. Я обновил вопрос с помощью кода службы.

3. @ccocker Я тоже добавил сервисный код. Вы подписываетесь дважды, но не ожидали асинхронного вызова. Вы бы все время получали объект по умолчанию. Просто верните свой вызов и подпишитесь на него.

4. Отлично, большое вам спасибо