如何使用一个模型中的值来塑造另一个模型的store.query()?

时间:2017-01-17 23:49:51

标签: ember.js firebase firebase-realtime-database ember-data emberfire

(我的项目正在使用Emberfire,它是Firebase与Ember的集成。这允许我通过Firebase直接进行数据库调用,或者只使用Ember中的内置模型函数)< / em>的

我有两个型号。一个是/users,包含有关用户的额外信息(特别是他们的schoolId)。另一个模型是/schools,每个ID下都包含schoolName /等信息。我正在尝试根据其schoolId信息附带的/users显示用户学校的名称。

我目前的做法是使用名为school-name.js的帮助程序,我只使用Firebase查询来返回值:

import Ember from 'ember';

export default Ember.Helper.extend({
  firebaseApp: Ember.inject.service(),
  compute(uid) {
    //Firebase Database Ref
    const database = this.get('firebaseApp').database();
    //Find the current user's schoolId
    database.ref('/users/' + uid).once('value').then(function(snapshot) {
        var schoolId = snapshot.val().schoolId;

        console.log("schoolId: " + schoolId);
        //Find the current user's schoolName based on their schoolId
        database.ref('/schools/' + schoolId).once('value').then(function(snapshot) {
          var schoolName = snapshot.val().schoolName;
          console.log(schoolName);
          return schoolName;
        });
    });
  }
});

这会使{。{1}}的console.log没有问题,但它不会在模板中显示。我的直觉告诉我,我必须对Ember和Firebase的承诺系统做一些事情,但我不知道从哪里开始,文档还没有很有帮助。

我之前的尝试是使用Firebase和Ember的模型系统。

schoolName

但是模板仍然不会加载信息。 我还通过仅使用Ember Store调用尝试了这一点,但是我不知道如何处理查询将返回数组而不是单个值。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

  1. 首次尝试帮助将返回Promise。这将在以后解决,您不能直接在模板中使用。对于这个用例,我更喜欢远离帮助者。
  2. 您的第二次尝试可以考虑findRecord而不是查询,这将返回单个记录。顺便说一下,我使用queryfirstObject来检索第一个数据。在您的代码中,问题是在解析schoolId之后考虑获取schollName。模型总是应该返回结果。
  3. model: function() {
            //Get current user's uid
            const uid = this.get('session.currentUser.uid');
    
            //Inject Firebase Auth
            const auth = this.get('firebaseApp').auth();
            var user = auth.currentUser;
    
            //Inject Firebase Database
            const database = this.get('firebaseApp').database();
    
           return database.ref('/users/' + uid).once('value').then((snapshot) => {
                var schoolId = snapshot.val().schoolId;
                console.log(schoolId);
                return this.store.query('schools', {
                    //Query specific school ID
                    equalTo: schoolId
                }).then((result) => {
                    return result.get('firstObject').get('schoolName');
                });
            });
        }
    
    1. 您可以考虑ember data relationship用户和学校模型。 您可以阅读本教程,
    2. https://www.toptal.com/emberjs/a-thorough-guide-to-ember-data http://thejsguy.com/2016/01/29/working-with-nested-data-in-ember-data-models.html http://andycrum.com/2014/06/02/getting-started-with-ember-data/

答案 1 :(得分:0)

非常感谢伟大的人们帮助EmberJS Slack!多亏了他们,我把这一切都整理好了!

事实证明,我只需要了解承诺如何运作。

最终解决方案:

模板/ application.hbs

{{#each model as |school|}}
    {{school.schoolName}}
{{/each}}

路由/ application.js中

model: function() {
    const uid = this.get('session.currentUser.uid');
    const store = this.store;
    var userInfo = this.store.query('user', {
        equalTo: uid
    });
    return userInfo.then(function(value) {
        var userInfoObject = value.get('firstObject');
        var schoolId = userInfoObject.get('schoolId');
        return store.query('school', {
            equalTo: schoolId
        });
    });
}

如果有人希望我就此提供意见/文件,请直接询问!