Ionic + AngularFire2服务 - 在本机应用程序Firebase功能失败,在桌面上工作

时间:2017-09-05 15:08:20

标签: angular firebase ionic-framework firebase-realtime-database angularfire2

我正在使用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(更新)

所以这就是行为:

  1. 安装应用

  2. 第一次运行它。 Firebase中已存在的数据会立即显示。但是当我尝试添加新数据或提交涉及Firebase命令的更改时,它不起作用。

  3. 退出应用程序,从内存中删除。 (App仍然安装,只是重新启动)。
  4. 第二次运行应用。
  5. App运行完美。
  6. 我不确定这是否有所不同,但我将部分用户数据合并到数据库中,因此我在.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);
        });
    }
    

    我认为这是我的应用程序中的用户订阅导致问题。这是另一个:

    1. 输入应用并登录。我被重定向到主页,收藏夹,这是两个标签之一。
    2. 输入第二个标签(已成功),即列表标签。返回收藏夹标签。
    3. 现在 list 标签已锁定,我无法点击它。该应用程序未冻结,但单击该选项卡不起作用。
    4. 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();
      }
      

0 个答案:

没有答案