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