AngularFire2:执行'加入'在FirebaseListObservables上使用RxJS .map()

时间:2017-02-20 16:01:13

标签: javascript firebase firebase-realtime-database rxjs angularfire2

如另一个问题所述,我正在使用Firebase作为后端开发Ionic 2应用程序。

我有类别,我有产品。产品属于类别。因为它是" n到m"关系,产品和类别存储在firebase中的单独节点中。我将数据结构如下:

Firebase data structure:

类别知道,哪些产品属于它们(密钥在" prods"每个类别的节点中引用)。产品知道它们属于哪些类别(键在" prod_cat"节点中引用)。 但是,当我列出所有类别时,我只知道属于该类别的产品的ID。在模板中,我需要显示更多详细信息,例如产品名称。

我读了许多类似的问题,提出了将产品信息添加到类别中的解决方案:

  import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Spinner;
    import android.widget.Toast;

    import java.util.ArrayList;
    import java.util.List;

    public class AddActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

        DatabaseHelper mylogsDB;
        Button btn_save;
        EditText etHours;
        Spinner etShift;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add);
            etHours = (EditText) findViewById(R.id.editText);
            etShift = (Spinner) findViewById(R.id.spinner);
            btn_save = (Button) findViewById(R.id.btn_save);
            mylogsDB = new DatabaseHelper(this);

            AddData();

            // Spinner click listener
            etShift.setOnItemSelectedListener(this);

            // Spinner Drop down elements
            List<String> categories = new ArrayList<>();
            categories.add("Πρωί");
            categories.add("Μεσημέρι");
            categories.add("Νύχτα");

            // Creating adapter for spinner
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories);

            // Drop down layout style - list view with radio button
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            // attaching data adapter to spinner
            etShift.setAdapter(dataAdapter);
        }

            public void onItemSelected (AdapterView <?> parent, View view,int position, long id) {
                // On selecting a spinner item
                String item = parent.getItemAtPosition(position).toString();

                // Showing selected spinner item
                Toast.makeText(parent.getContext(), "Έχετε επιλέξει: " + item, Toast.LENGTH_LONG).show();
        }


        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }

        public void AddData() {
            btn_save.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String hours = etHours.getText().toString();
                    String shift = etShift.getSelectedItem().toString();

                    boolean insertData = mylogsDB.addData(hours, shift);

                    if (insertData == true) {
                        Toast.makeText(AddActivity.this, "Η αποθήκευση ολοκληρώθηκε επιτυχώς.", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(AddActivity.this, "Ώχ,Κάτι πήγε στραβά.", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    }

不幸的是,这不起作用。 如代码中的注释所示,产品信息被正确收集并记录到控制台(参见下面的屏幕截图): console screenshot

但是,上述函数的返回对象是&#34; undefined&#34;。

当我尝试声明时,明确地返回一个FirebaseListObservable类型的对象,我收到错误:

  

键入&#39; Observable&#39;不能分配到&#39; FirebaseListObservable&#39;。     物业&#39; $ ref&#39;类型&#39; Observable&#39;

中缺少

有人知道我还能尝试什么吗?

非常感谢你!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

提供商(* .ts):

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
 <android.support.v4.widget.NestedScrollView
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="true"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
<LinearLayout>
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="111111111111111111111111111"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="111111111111111111111111111"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="111111111111111111111111111"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="111111111111111111111111111"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="111111111111111111111111111"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="sadsff"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

提交者调用tempaltes ts文件:

getProductsOfCategory(catId){
  let result = this.af.database.list('/categories/'+catId+'/prods')
    .map(items => { 
      for (let product of items) { 
        this.af.database.object('/products/'+product.$key)
        .subscribe( data => {
          product.details = data;
        });
      }
      return items;        
    })      
  return result;
}


getCategoriesAndProducts(){
  let result = this.af.database.list('/categories')
    .map(items => { 
      for (let category of items) {
        this.getProductsOfCategory(category.$key)
        .subscribe(data => {
          category.productDetails = data;
        })
      }
      return items;
    })
  return result;
}

模板/视图(* .html):

getCategoriesAndProducts(){
    this.categoryService.getCategoriesAndProducts()
      .subscribe(data => {
          this.categoriesAndProducts = data;
});