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

罗斯

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

通过执行以下操作,我可以使它在一条路线中起作用:

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

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

谁能建议最好的方法吗?使用服务的最佳方法是吗?如果是这样,如何确保会话对象可用后服务中的代码得以执行?

更新

我设法使我的应用程序可以与以下解决方案一起使用:

创建使用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服务

这用于将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();
      }
    });
  }

});

user服务注入应用程序路由

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

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

});

user任何需要的地方注入服务

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

user: Ember.inject.service()
...
let currentUser = this.get('user').get('currentUser');
迪万斯基

评论中的所述,最好的选择是使用服务。我正在为会话使用Ember-Simple-auth,这是我实现自己的自定义会话的方式,该会话可全局保存已登录的用户:

服务/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();
      }
    });
  }
});

将服务注入应用程序路由

您需要在“应用程序”路由上注入它,以便用户帐户在全球范围内可用。

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

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

});

将服务注入任何其他Route / Controller的示例

本示例使用会话帐户将当前登录的用户与要检索的模型进行比较。目的是仅允许个人资料信息的拥有者对其进行编辑。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章