我正在使用Ionic来构建应用。我正在使用Firebase,因此使用AngularFire2来管理数据库功能。我将所有数据库功能都放入了服务中。
在Angular组件中,我有数据库绑定,当用户说,添加一个新项时,我只是将它们$key
传递给我的服务(它也有一个数据库引用/绑定)并运行查询,例如更新或删除等等。
示例:
service.ts
import { Injectable } from '@angular/core';
import { AngularFireDatabase, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2/database';
@Injectable()
export class MovieListService {
lists: FirebaseListObservable<any[]>;
constructor(private db: AngularFireDatabase) {
this.lists = db.list(id + '/mainLists/');
}
addNewList(title: string) {
this.lists.push(new List(title));
}
}
然后我有正常的组件:
lists.ts
...
lists: FirebaseListObservable<any[]>;
ionViewWillEnter() {
this.lists = this.db.list('/' + id + '/mainLists/');
}
onNewList() {
this.service.addNewList('My List');
this.navCtrl.popToRoot();
}
...
这是数据流如何发生的一个粗略示例。我重用了一些函数,所以我真的想将所有Firebase内容划分为一个服务。这是一种不好的做法吗?就像我说的那样,它在桌面Web浏览器ionic serve
上运行良好,但当我ionic cordova run android
在手机上运行应用程序时,我会点击添加新列表,应用程序什么也不做。因为我没有控制台,所以我没有办法看到反馈。该应用程序不会冻结,我可以转到其他视图等,但添加的按钮是没有生气的,所以我知道它必须是不能原生工作的AngularFire2命令。
编辑1
我在上面的代码中添加了this.navCtrl.popToRoot();
,因为这就是我设置应用的方式。我设置了toast
,我知道它正在进入服务,但页面不弹回到root。我还添加了angularfire2方法的承诺:
const promise = this.lists.push(new List(title));
promise
.then( res => {
let toast1 = this.toastCtrl.create({
message: JSON.stringify('THEN'),
duration: 5000,
position: 'bottom'
});
toast1.present();
})
.catch( err => {
let toast2 = this.toastCtrl.create({
message: JSON.stringify('CATCH'),
duration: 5000,
position: 'bottom'
});
toast2.present();
});
我没有得到这些敬酒中的任何一个,因此我的原生设备上的行this.movieLists.push(new MovieList(title));
不会执行。
为什么它没有执行的任何想法?它是为Web浏览器制作的,而不是用于本机应用程序或其他东西?从理论上讲,这应该是有意义的,它应该是有效的,并且在Web浏览器中,它是。
编辑2(更新)
所以这就是行为:
安装应用
第一次运行它。 Firebase中已存在的数据会立即显示。但是当我尝试添加新数据或提交涉及Firebase命令的更改时,它不起作用。
我不确定这是否有所不同,但我将部分用户数据合并到数据库中,因此我在.subscribe
内为用户提供了列表检索:
service.ts
constructor(private http: Http,
private db: AngularFireDatabase,
private authService: AuthService) {
this.authService.user.subscribe((user: firebase.User) => {
this.user = user;
this.lists = db.list(user.uid + '/lists/');
var data = {};
data['/user'] = {
displayName: user.displayName,
email: user.email,
emailVerified: user.emailVerified,
photoUrl: user.photoURL,
uid: user.uid
};
db.object(user.uid).update(data);
});
}
我认为这是我的应用程序中的用户订阅导致问题。这是另一个:
app.component.ts 的示例:
this.authService.user.subscribe((user: firebase.User) => {
if (user) {
this.userProfile = user;
this.onLoad(TabsPage);
} else {
this.userProfile = null;
this.onLoad(SigninPage);
}
});
auth.ts
user: Observable<firebase.User>;
constructor(private facebook: Facebook,
private googlePlus: GooglePlus,
private platform: Platform,
private afAuth: AngularFireAuth) {
this.user = afAuth.authState;
}
signinGoogle(): void {}
signinFacebook(): void {}
signOut() {
this.afAuth.auth.signOut();
}