无法使用 AngularFire 和离子调用 AngularFirestoreCollections 上的某些函数
Unable to call some functions on AngularFirestoreCollections with AngularFire and ionic
我正在试验 AngularFire 和 Ionic。我正在尝试按照我发现的一些教程进行操作,并尝试根据当前 AngularFire example from their github. 上找到的示例几乎 100% 地模拟我正在制作的服务 我遇到的问题是任何时候我制作一个集合,none 方法,例如 .add()、where() 或 snapshotChanges() 似乎有效。在我的 WebStorm IDE 上,它们是红色的,表示方法未解决。
我不确定这是否可能是版本问题,或者我的导入是否有误,或者只是我阅读了一些错误的信息。我已经看到了很多示例 projects/tutorials,我正在查看的这个特定模式似乎很常见,这让我感到困惑。另外我刚刚删除了节点模块和 运行 一个新的 npm 安装。如果有人能在正确的方向上帮助 me/point 我,那就太好了!谢谢
以下是一些相关文件:
userservice.ts
import {AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore'
import {Injectable} from "@angular/core";
import 'firebase/storage';
import {Observable} from "rxjs";
import {map} from "rxjs/internal/operators";
/**
* Created by Ben on 12/26/2018.
*/
export interface User {
displayName: string;
}
export interface UserId extends User {
id: string
}
@Injectable()
export class UserService {
private usersCollection: AngularFirestoreCollection;
private users: Observable<UserId[]>;
constructor(public db: AngularFirestore) {
this.usersCollection = db.collection('users');
this.users = this.usersCollection.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as User;
const id = a.payload.doc.id;
return {id, ...data};
})
})
)
}
saveUser(idToken: string, user: User) {
return this.usersCollection.doc('idToken').add({
displayName: user.displayName
});
}
getUsersByDisplayName(displayName:string){
return this.usersCollection.where("displayName", "===", displayName);
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { AngularFireModule } from 'angularfire2';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { MyApp } from './app.component';
import {FIREBASE_CONFIG} from "./app.firebase.config";
import {AuthService} from "../services/authservice";
import {HouseService} from "../services/houseservice";
import {UserService} from "../services/userservice";
@NgModule({
declarations: [
MyApp,
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
AngularFireModule.initializeApp(FIREBASE_CONFIG),
AngularFireAuthModule,
AngularFirestoreModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
],
providers: [
StatusBar,
SplashScreen,
AuthService,
HouseService,
UserService,
{provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}
package.json
{
"name": "firebaseauth",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"start": "ionic-app-scripts serve",
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint"
},
"dependencies": {
"@angular/animations": "5.2.11",
"@angular/common": "5.2.11",
"@angular/compiler": "5.2.11",
"@angular/compiler-cli": "5.2.11",
"@angular/core": "5.2.11",
"@angular/forms": "5.2.11",
"@angular/http": "5.2.11",
"@angular/platform-browser": "5.2.11",
"@angular/platform-browser-dynamic": "5.2.11",
"@ionic-native/core": "~4.17.0",
"@ionic-native/splash-screen": "~4.17.0",
"@ionic-native/status-bar": "~4.17.0",
"@ionic/storage": "2.2.0",
"angularfire2": "^5.1.1",
"firebase": "^5.7.1",
"ionic-angular": "3.9.2",
"ionicons": "3.0.0",
"promise-polyfill": "^8.1.0",
"rxjs": "^6.3.3",
"rxjs-compat": "^6.3.3",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.26"
},
"devDependencies": {
"@ionic/app-scripts": "3.2.1",
"typescript": "~2.6.2"
},
"description": "An Ionic project"
}
您找到了正确的文档,但看起来有些问题。您在错误的对象上调用了 .add()
方法,它应该在整个 集合 上,而您正试图在单个 文档上使用它.
来自 the link you gave,请注意此(截断)代码在 集合 上使用 .add()
:
constructor(private afs: AngularFirestore) {
this.itemsCollection = afs.collection<Item>('items');
}
addItem(item: Item) {
this.itemsCollection.add(item);
}
当你试穿一个人的时候文档:
this.usersCollection.doc('idToken').add(
如果您要向该集合添加新文档,只需对集合使用 .add()
。
另一方面,如果您尝试向单个文档添加详细信息,请查看 this documentation on AngularFire2, as well as the base Firebase documentation,其中显示您有 .set()
、.update()
、.get()
,并且 .delete()
可用于与文档进行交互。
关于你的问题 .where()
...
您也没有为 where
子句使用正确的语法,请查看 this doc on querying collections 他们提供的正确语法示例:
afs.collection('items', ref => ref.where('size', '==', 'large'))
所以你的应该是:
return afs.collection('users', ref => ref.where('displayName', '==', displayName));
我遇到的主要问题是我的 WebStorm IDE 已经过时 2 年了,无法识别很多打字稿类型。我发布这个是为了防止一些和我处境相同的迷失灵魂找到这个。感谢 JeremyW 的回答,因为它是正确的!
我正在试验 AngularFire 和 Ionic。我正在尝试按照我发现的一些教程进行操作,并尝试根据当前 AngularFire example from their github. 上找到的示例几乎 100% 地模拟我正在制作的服务 我遇到的问题是任何时候我制作一个集合,none 方法,例如 .add()、where() 或 snapshotChanges() 似乎有效。在我的 WebStorm IDE 上,它们是红色的,表示方法未解决。
我不确定这是否可能是版本问题,或者我的导入是否有误,或者只是我阅读了一些错误的信息。我已经看到了很多示例 projects/tutorials,我正在查看的这个特定模式似乎很常见,这让我感到困惑。另外我刚刚删除了节点模块和 运行 一个新的 npm 安装。如果有人能在正确的方向上帮助 me/point 我,那就太好了!谢谢
以下是一些相关文件:
userservice.ts
import {AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore'
import {Injectable} from "@angular/core";
import 'firebase/storage';
import {Observable} from "rxjs";
import {map} from "rxjs/internal/operators";
/**
* Created by Ben on 12/26/2018.
*/
export interface User {
displayName: string;
}
export interface UserId extends User {
id: string
}
@Injectable()
export class UserService {
private usersCollection: AngularFirestoreCollection;
private users: Observable<UserId[]>;
constructor(public db: AngularFirestore) {
this.usersCollection = db.collection('users');
this.users = this.usersCollection.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as User;
const id = a.payload.doc.id;
return {id, ...data};
})
})
)
}
saveUser(idToken: string, user: User) {
return this.usersCollection.doc('idToken').add({
displayName: user.displayName
});
}
getUsersByDisplayName(displayName:string){
return this.usersCollection.where("displayName", "===", displayName);
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { AngularFireModule } from 'angularfire2';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { MyApp } from './app.component';
import {FIREBASE_CONFIG} from "./app.firebase.config";
import {AuthService} from "../services/authservice";
import {HouseService} from "../services/houseservice";
import {UserService} from "../services/userservice";
@NgModule({
declarations: [
MyApp,
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
AngularFireModule.initializeApp(FIREBASE_CONFIG),
AngularFireAuthModule,
AngularFirestoreModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
],
providers: [
StatusBar,
SplashScreen,
AuthService,
HouseService,
UserService,
{provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}
package.json
{
"name": "firebaseauth",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"start": "ionic-app-scripts serve",
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint"
},
"dependencies": {
"@angular/animations": "5.2.11",
"@angular/common": "5.2.11",
"@angular/compiler": "5.2.11",
"@angular/compiler-cli": "5.2.11",
"@angular/core": "5.2.11",
"@angular/forms": "5.2.11",
"@angular/http": "5.2.11",
"@angular/platform-browser": "5.2.11",
"@angular/platform-browser-dynamic": "5.2.11",
"@ionic-native/core": "~4.17.0",
"@ionic-native/splash-screen": "~4.17.0",
"@ionic-native/status-bar": "~4.17.0",
"@ionic/storage": "2.2.0",
"angularfire2": "^5.1.1",
"firebase": "^5.7.1",
"ionic-angular": "3.9.2",
"ionicons": "3.0.0",
"promise-polyfill": "^8.1.0",
"rxjs": "^6.3.3",
"rxjs-compat": "^6.3.3",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.26"
},
"devDependencies": {
"@ionic/app-scripts": "3.2.1",
"typescript": "~2.6.2"
},
"description": "An Ionic project"
}
您找到了正确的文档,但看起来有些问题。您在错误的对象上调用了 .add()
方法,它应该在整个 集合 上,而您正试图在单个 文档上使用它.
来自 the link you gave,请注意此(截断)代码在 集合 上使用 .add()
:
constructor(private afs: AngularFirestore) {
this.itemsCollection = afs.collection<Item>('items');
}
addItem(item: Item) {
this.itemsCollection.add(item);
}
当你试穿一个人的时候文档:
this.usersCollection.doc('idToken').add(
如果您要向该集合添加新文档,只需对集合使用 .add()
。
另一方面,如果您尝试向单个文档添加详细信息,请查看 this documentation on AngularFire2, as well as the base Firebase documentation,其中显示您有 .set()
、.update()
、.get()
,并且 .delete()
可用于与文档进行交互。
关于你的问题 .where()
...
您也没有为 where
子句使用正确的语法,请查看 this doc on querying collections 他们提供的正确语法示例:
afs.collection('items', ref => ref.where('size', '==', 'large'))
所以你的应该是:
return afs.collection('users', ref => ref.where('displayName', '==', displayName));
我遇到的主要问题是我的 WebStorm IDE 已经过时 2 年了,无法识别很多打字稿类型。我发布这个是为了防止一些和我处境相同的迷失灵魂找到这个。感谢 JeremyW 的回答,因为它是正确的!