页面刷新取消设置Ember控制器属性

时间:2013-09-27 15:23:47

标签: ruby-on-rails ember.js devise

如果我进行手动页面刷新或设置这样的重定向

}).then(function() {
  document.location = "/";
}, function() {

在我的Ember应用程序的一个函数中,Ember控制器属性正在变得未设置。我不确定哪个属性正在变得不重要,但如果确实如此,这就是代码。在我的应用程序模板中,我检查用户是否经过身份验证

    {{#if isAuthenticated}}
         blah blah
    {{else}}
        blah blah
    {{/if}}

该属性在AuthController中设置

App.AuthController = Ember.ObjectController.extend({
    currentUser: null,
    isAuthenticated: Em.computed.notEmpty("currentUser.email"),
    login: function(route) {
      var me;
      me = this;
      return $.ajax({
        url: "/users/sign_in.json",
        type: "POST",
        data: {
          "user[email]": route.currentModel.email,
          "user[password]": route.currentModel.password
        },
        success: function(data) {

          me.set('currentUser', data.user);

因此,在我刷新页面后,我的currentUser(根据Ember)不再显示为已验证。但是,在(Ruby on Rails)服务器端,用户仍然经过身份验证。我把这些代码放在布局中进行检查,在Ember认为我已退出(刷新页面)后,我的服务器代码仍然告诉我我已登录(事实上我已经登录)。

    <% if current_user %>
    there is a current user
    <% end %>

你能解释为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

如果isAuthenticated为空,那么设置最好是将/users/current作为一个计算属性,使ajax GET currentUser。如果用户未经过身份验证,则/users/current应返回{},如果用户身份,则返回当前用户数据。

App.AuthController = Ember.ObjectController.extend({
  currentUser: null,
  isAuthenticated: function() {
    var currentUser = this.get('currentUser');
    if(Ember.isEmpty(currentUser)) {
      $.ajax({
        type: "GET",
        url: "/users/current.json",
        async: true
      }).done( function( data ) {
        me.set('currentUser', data.user);
      });
      return false;
    } else {
      return true;
    }
  }.property('currentUser'),

});

答案 1 :(得分:1)

为什么要进行手动页面刷新?这样您就可以从头开始完全启动浏览器,因此Ember App会再次初始化,因此未在Controller上设置属性currentUser。

而不是这样做:

}).then(function() {
  document.location = "/";
}, function() {

我假设您要转到应用的开始页面(因为您想要转到“/”)。 相反,您应该使用路由之间转换的Ember功能。我不知道,您执行上述代码的位置,但您可以通过其中一个控制器或路径执行此操作。

在控制器中,您可以使用transitionToRoute

// index is a Route which is implicitly generated by Ember for you
this.transitionToRoute('index');

在路由器中,您可以使用transitionTo

this.transitionTo('index');