我如何使用一个模型的值来塑造另一个模型的 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 数组而不是单个值这一事实。
感谢任何帮助!
- 第一次尝试与助手将return 承诺。这将在稍后解决,您不能直接在模板中使用。对于这个用例,我更愿意远离 helper。
- 你的第二次尝试你可以考虑findRecord而不是查询,这将return单条记录。顺便说一下,我使用
query
和 firstObject
来检索第一个数据。在您的代码中,问题是在解析 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');
});
});
}
- 您可以考虑 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 就尽管问!
(我的项目正在使用 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 数组而不是单个值这一事实。
感谢任何帮助!
- 第一次尝试与助手将return 承诺。这将在稍后解决,您不能直接在模板中使用。对于这个用例,我更愿意远离 helper。
- 你的第二次尝试你可以考虑findRecord而不是查询,这将return单条记录。顺便说一下,我使用
query
和firstObject
来检索第一个数据。在您的代码中,问题是在解析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'); }); }); }
- 您可以考虑 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 就尽管问!