gpt4 book ai didi

javascript - Ember.js:使当前用户全局可访问

转载 作者:搜寻专家 更新时间:2023-11-01 04:30:17 25 4
gpt4 key购买 nike

我正在编写一个 ember 应用程序(使用 ember 2.3.0),使用 emberfire 和 torii 进行身份验证。用户登录后,我可以在 torii session 对象中使用他们的 uid。我还有一个 user 模型,想在我的模板、路由等中访问与当前用户相关的其他数据。

我可以通过执行以下操作使它在单个路径中工作:

let uid = this.get('session').get('uid');
this.store.findRecord('user', uid).then(user => {
console.log(user.get('firstName'));
});

但希望避免为需要访问它的每个路由/ Controller 编写此代码。

有人可以建议最好的方法吗?是使用服务的最佳方式吗?如果是这样,我如何确保我的服务中的代码在我的 session 对象可用后执行?

更新

我设法让我的应用程序使用以下解决方案:

创建一个使用 firebase 登录用户的方法

我创建了一个 mixin 来处理登录行为。然后在登录页面和注册页面上使用它。

// Mixin to handle logging in

import Ember from 'ember';

export default Ember.Mixin.create({

user: Ember.inject.service(),

email: null,
errorMsg: null,

logInUser(email, password) {

// logout existing user if any and then login new user
this.get('session').close()
.then(() => {
// if already a user logged in
this.firebaseLogin(email, password);
})
.catch(() => {
// if no user logged in
this.firebaseLogin(email, password);
});
},

firebaseLogin(email, password) {
this.get("session").open("firebase", {
provider: 'password',
email: email,
password: password
})
.then((data) => {
// If successful, fetch the user and transition to home page
console.log("Successfully logged in as ", data);
this.get('user').loadCurrentUser().then(() => {
this.transitionToRoute('index');
});

})
.catch(error => {
this.set('errorMsg', error);
});
},

});

创建一个用户服务

这用于将 user 模型与身份验证用户相关联。

app/services/user.js

import Ember from 'ember';

export default Ember.Service.extend({

store: Ember.inject.service(),
session: Ember.inject.service(),

currentUser: null,

loadCurrentUser() {
return new Ember.RSVP.Promise((resolve, reject) => {
const uid = this.get('session').get('uid');
if (!Ember.isEmpty(uid)) {
return this.get('store').find('user', uid).then((user) => {
this.set('currentUser', user);
resolve();
}, reject);
} else {
this.set('currentUser', null);
resolve();
}
});
}

});

用户服务注入(inject)应用程序路由

每当加载应用程序时(例如,当用户刷新页面时),都会调用应用程序路由。因此,正如@Deovandski 在他的回答中提到的,您需要将其注入(inject)应用程序路由,以便用户帐户在全局范围内可用。

app/routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({

user: Ember.inject.service(),

beforeModel() {
return this.get("session").fetch()
.then(() => {
// Session retrieved successfully
console.log('session retrieved');
return this.get('user').loadCurrentUser();
})
.catch(() => {
// Session could not be retrieved
this.transitionTo('login');
});
}

});

在需要的地方注入(inject)user服务

然后您可以通过以下方式访问当前用户:

user: Ember.inject.service()
...
let currentUser = this.get('user').get('currentUser');

最佳答案

locks 所述在评论中,最好的选择是使用服务。我正在使用 Ember-Simple-auth对于我的 session ,这就是我实现自己的自定义 session 的方式,该 session 在全局范围内保存登录用户:

服务/session-account.js

import Ember from 'ember';

const { inject: { service }, RSVP } = Ember;

export default Ember.Service.extend({
session: service('session'),
store: service(),

loadCurrentUser() {
return new RSVP.Promise((resolve, reject) => {
const uid = this.get('session.data.authenticated.uid');
if (!Ember.isEmpty(userId)) {
return this.get('store').find('user', uid).then((user) => {
this.set('user', user);
resolve();
}, reject);
} else {
resolve();
}
});
}
});

将服务注入(inject)应用程序路径

您需要将其注入(inject)应用程序路由,以便用户帐户在全局范围内可用。

const { service } = Ember.inject;
export default Ember.Route.extend(ApplicationRouteMixin, {
session: service('session'),
sessionAccount: service('session-account'),

beforeModel() {
return this.get('sessionAccount').loadCurrentUser();
}

});

将服务注入(inject)任何其他路由/ Controller 的示例

此示例使用 session 帐户将当前登录的用户与正在检索的模型进行比较。目的是只允许拥有它的用户编辑个人资料信息。

import Ember from 'ember';
const { service } = Ember.inject;

export default Ember.Route.extend ({
session: service('session'),
sessionAccount: service('session-account'),
model: function() {
return Ember.Object.create ({
user: this.modelFor('user'),
users: this.store.findAll('user')
});
},
afterModel(model, transition) {
if (model.user.get('id') === this.get('sessionAccount.user.id')) {
// Allow Editing
}
else{
this.transitionTo('index');
}
}
});

关于javascript - Ember.js:使当前用户全局可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com