如另一个问题所述,我正在使用Firebase作为后端开发Ionic 2应用程序。
我有类别,我有产品。产品属于类别。因为它是" n到m"关系,产品和类别存储在firebase中的单独节点中。我将数据结构如下:
类别知道,哪些产品属于它们(密钥在" 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;
中缺少
有人知道我还能尝试什么吗?
非常感谢你!
答案 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;
});