Backbone中的类方法

时间:2013-09-16 18:22:09

标签: javascript backbone.js devise

我正在尝试使用Backbone使用Devise(Rails的身份验证gem)实现身份验证。用户可以通过向/users/sign_out/发送DELETE请求来退出Backbone,这样我就无法使用此链接,因为如果我点击它就是GET请求

<li><a href="/users/sign_out" class="thumbnail plain">sign out</a></li>

然后我在User模型上创建了一个logout方法,但要触发它我必须有一个用户模型的实例(显然)。我在路由器中创建了一个通过导航到logout路由触发的注销方法,但由于我只能使用它的实例在用户模型上调用logout,我正在创建一个新模型在注销方法中只是为了调用注销。

    "logout": "logout"

    },

    logout: function(){
     var foo = new app.Models.User
     foo.logout();

    }

这显然是一个坏主意,但我不知道还能做什么。你能推荐我应该做的事吗?有没有办法让注销成为一个类方法,所以我不需要实例化一个新模型只是为了注销或其他什么?

更新

这是User模型中的createUser方法,用于发送注册数据以进行设计。在成功回调中,它将会话分配给变量window.app.current_user = userSession;。我还尝试在路由器上调用用户模型的注销方法,如此

在路由器中注销

logout: function(){  
    window.app.current_user.logout();
    }

-

app.Models.User = Backbone.Model.extend({
      initialize:function () {       

    }, 
    createUser: function() {
    var user = {};
    user['email'] = this.get("email");
    user['password'] = this.get("password");
    user['password_confirmation'] = this.get("password_confirmation");
    var registration = {};
    registration['user'] = user; 
  var _this = this;
  $.ajax({
    url: '/users.json',
    type: "POST",
    data: {user: user, registration: registration},
    success: function(userSession, response) {

      window.app.current_user = userSession;

    },

   ... code ommitted

logout: function(){
  var me;
  console.log("Logging out...");
  me = this;
  return $.ajax({
    url: '/users/sign_out',
    type: "DELETE",
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
       window.app.current_user = '';

    },
    error: function(jqXHR, textStatus, errorThrown) {
      return alert("Error logging out: " + errorThrown);
    }
  });

}, 

1 个答案:

答案 0 :(得分:2)

我有点困惑为什么在尚未创建用户模型时想要触发注销功能。能否解释一下你在路由器中注销这个功能背后的原因?

就个人而言,我会有一个会话模型,它会监听链接的点击事件。然后,这将调用一个logout方法,该方法将发出DELETE请求。

更新

这是一个快速的JsFiddle,它显示了创建模型并将其附加到全局变量: http://jsfiddle.net/Francium123/eBG3E/2/

    var User = Backbone.Model.extend({
     initialize:function () {       
        this.name = "MyName";
        this.password = "password"
    }, 

    login:function(){
        console.log("login called");
    },

logout: function(){
      console.log("logout called");
    }
});

window.MyModels = window.MyModels || {}; 
window.MyModels.User = new User();

console.log(window.MyModels.User.login());
console.log(window.MyModels.User.logout());

请注意,这只是一个示例,我怀疑您是否希望将密码存储在模型中!

此外,您应该能够使用Backbone Models fetch(GET),save(POST / PUT),destroy(DELETE)方法,而不是直接在模型中编写ajax请求。如果需要,您可以覆盖模型同步方法。