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

How can I use a value from one model to shape my store.query() of another?

(我的项目正在使用 Emberfire,它是 Firebase 对 Ember 的集成。这让我可以通过 Firebase 直接调用数据库,或者只使用Ember)

中的内置模型函数

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

我目前的方法是使用一个名为 school-name.js 的助手,其中我仅使用 Firebase 查询 return 值:

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;
        });
    });
  }
});

这将console.log schoolName 没有问题,但不会在模板中显示它。我的直觉告诉我,我必须使用 Ember 和 Firebase 的 promises 系统做一些事情,但是我不知道从哪里开始,文档也​​不是很有帮助。

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

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();

        if (user) {
            // User is signed in.
            var schoolIdRef = database.ref('/users/' + uid).once('value').then(function(snapshot) {
                var schoolId = snapshot.val().schoolId;
                console.log(schoolId);
                // ...
            });
            console.log(schoolId);
            return this.store.query('schools', {
                //Query specific school ID
                equalTo: "0" //SET THIS TO schoolId SOMEHOW
            });
        } else {
            // No user is signed in.
        }

    }

但是模板仍然无法加载信息。 我也尝试过仅使用 Ember 存储调用,但是我不知道如何处理查询将 return 数组而不是单个值这一事实。

感谢任何帮助!

  1. 第一次尝试与助手将return 承诺。这将在稍后解决,您不能直接在模板中使用。对于这个用例,我更愿意远离 helper。
  2. 你的第二次尝试你可以考虑findRecord而不是查询,这将return单条记录。顺便说一下,我使用 queryfirstObject 来检索第一个数据。在您的代码中,问题是在解析 schoolId 之后考虑获取 schollName。模型总是应该 return 结果。
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 用户和学校模型。 您可能会阅读本教程,

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/

非常感谢在 EmberJS Slack 上提供帮助的大人们!多亏了他们,我才把这一切都解决了!

事实证明,我只需要了解 promise 的工作原理即可。

最终解决方案:

templates/application.hbs


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

routes/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
        });
    });
}

如果有人希望我提供 comments/documentation 就尽管问!