Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 如何使用一个模型中的值来塑造另一个模型的store.query()?_Ember.js_Firebase_Firebase Realtime Database_Ember Data_Emberfire - Fatal编程技术网

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

Ember.js 如何使用一个模型中的值来塑造另一个模型的store.query()?,ember.js,firebase,firebase-realtime-database,ember-data,emberfire,Ember.js,Firebase,Firebase Realtime Database,Ember Data,Emberfire,我的项目使用的是Emberfire,它是Firebase对Ember的集成。这使我可以通过Firebase直接调用数据库,或者只使用Ember中的内置模型函数 我有两个模型。一个是/users,包含关于用户的额外信息,特别是他们的学校ID。另一个模型是/schools,它在每个id下保存诸如schoolName等信息。我试图根据附加到用户信息的schoolnid显示用户学校的名称 我目前的方法是使用一个名为school-name.js的助手,其中我只使用Firebase查询返回值: import

我的项目使用的是Emberfire,它是Firebase对Ember的集成。这使我可以通过Firebase直接调用数据库,或者只使用Ember中的内置模型函数

我有两个模型。一个是/users,包含关于用户的额外信息,特别是他们的学校ID。另一个模型是/schools,它在每个id下保存诸如schoolName等信息。我试图根据附加到用户信息的schoolnid显示用户学校的名称

我目前的方法是使用一个名为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;
        });
    });
  }
});
这将console.log毫无问题地记录学校名称,但不会在模板中显示。我的直觉告诉我,我必须对余烬和Firebase的承诺系统做些什么,但是我不知道从哪里开始,而且这些文档还没有很好的帮助

我以前的尝试是使用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存储调用,但是我不知道该怎么做,因为查询将返回一个数组而不是单个值

感谢您的帮助

第一次尝试帮助将返回承诺。这将在以后解决,您不能直接在模板中使用。对于这个用例,我宁愿远离helper。 您的第二次尝试可以考虑替代查询,这将返回单个记录。顺便说一下,我使用query和firstObject来检索第一个数据。在您的代码中,问题是在解析学校ID后考虑获取S学名。模型应始终返回结果。 你可以考虑用户和学校模型。 您可能会阅读本教程,

非常感谢那些帮助我们渡过难关的伟人!多亏了他们,我才把这一切都解决了

事实证明,我只需要了解承诺是如何起作用的

最终解决方案: 模板/application.hbs

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

如果有人想让我对此提供评论/文档,请询问

谢谢你的信息!你知道关于余烬关系的任何其他文档吗?它们似乎没有很好的文档记录,至少一开始似乎很难理解。谢谢更新了教程的一些链接。将始终更新最新版本。
{{#each model as |school|}}
    {{school.schoolName}}
{{/each}}
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
        });
    });
}