backbone.js ajax调用

Joh*_*per 9 javascript backbone.js

我正在学习Backbone.js我正在构建的新应用程序.我需要执行AJAX调用(REST SERVICE)来进行身份验证.

这个电话的正确位置在哪里?在模型,视图或其他地方?特别与Backbone.js MVC模型有关.

<html>
<head>
<script src="lib/jquery-1.6.1.min.js"></script>
<script src="lib/json2.js"></script>
<script src="lib/underscore-min.js"></script>
<script src="lib/backbone-min.js"></script>   

<script language="javascript">
      $(function(){
         var LoginView = Backbone.View.extend({
          el: $("#login-form"),

          events: {
            "click #login": "login"
          },

          login: function(){
              alert("Hello");
           }
        });

        window.LoginView = new LoginView();
      });
    </script>   
  </head>
  <body>
    <form action="/login" id="login-form">
      Username: <input type="text" id="username"><br>
      Password: <input type="password" id="password"><br>
      <button id="login">Login</button>
    </form>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

rea*_*ers 13

创建一个身份验证模型,用于存储帖子状态(用户名,密码,记住我)以及响应状态(登录失败,登录已接受)...

App.Model.authentication= Backbone.Model.extend({
    defaults: {
        Username: "",
        Password: "",
        RememberMe: false,
        LoginFailed: false,
        LoginAccepted: false
    },
    url:"api/authentication"
});
Run Code Online (Sandbox Code Playgroud)

更新视图以使用模型:

   $(function () {
    var LoginView = Backbone.View.extend({
        model: new App.Model.authentication(),
        el: $("#login-form"),
        events: {
            "click #login": "login"
        },

        login: function () {
            this.model.save({username: this.$el.find("#username"),
                password: this.$el.find("#password")}, {
                success: function () {
                    /* update the view now */
                },
                error: function () {
                    /* handle the error code here */
                }
            });
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

);

调用Model.Save()将发出一个POST请求到服务器,虽然在服务器上的这种情况下,你实际上并没有节省什么,但检查凭据,并发送回相同型号的对象,但与"LoginAccepted"字段设置适当.

不要实现自定义的JQuery AJAX帖子 - 它不是骨干的精神,它通过其REST接口为您提供全部处理.

有关REST接口以及主干在此处使用的各种REST操作和URL的更多详细信息:http://codebyexample.info/2012/04/30/backbone-in-baby-steps-part-3/

关于AJAX vs model.save()辩论的另一件事.如果你的应用是一个无状态的聊天室如IRC - 自定义AJAX调用它发送消息给其他用户在聊天室,但不集中保存的消息......你会扔掉所有的骨干REST功能和重新实现它们因为你实际上没有'保存',你真的只是'发送'.这将花费你大量的工作来重新实现已经存在的功能,仅仅是因为语义.始终将model.save()读作model.post() - 它不仅仅用于保存 - 用于发送.

  • 我想说,当骨干网启用REST时,它会将骨干内的ajax调用交织在一起,并为你处理这些事情:save只是将数据发布到服务器的方法的名称 - 它也可以被命名为'发布','提交'或'验证'.我们的代码确实完全相同.Backbone为您执行确切的$ POST请求. (2认同)

mvb*_*fst 11

您总是从视图开始,因为您的DOM交互(包括表单提交)发生在视图中.

然后,如果我是你,我会向User模型添加一个自定义方法,并从视图中调用该方法.登录方法不完全适合本机Backbone同步,因为您没有尝试添加/更新/检索任何内容(请注意,出于安全原因,您不希望从服务器加载用户密码或密码哈希).所以你不用调用Backbone fetch()就可以进行常规的Ajax调用.所以,你走了:

var UserModel = Backbone.Model.extend({
  ...
  checkLogin: function(name, password) {
    var self = this;
    $.post('/login', { name: name, password: password }, function(data) {
      self.set(data); // data should be in JSON and contain model of this user
    }, 'json').error(
      self.trigger('loginError'); // our custom event
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

并且观点:

var UserView = Backbone.View.extend({
  events: {
    'click .login': 'loginSubmit'
  },

  initialize: function() {
     _.bindAll(this, 'loginSubmit', 'loginSuccess', 'loginError');
     this.model.bind('change', this.loginSuccess);
     this.model.bind('loginError', this.loginError);
  },

  loginSubmit: function() {
    var name = 'username', // you get it from some element
        password = '***'; // you get it from another element
    this.model.checkLogin(name, password);
  },

  loginSuccess: function() {
    alert ('You have been logged in');
    console.log(this.model); // should log loaded user model
  },

  loginError: function() {
    alert ('Problem with login');
  }
});
Run Code Online (Sandbox Code Playgroud)

确保将UserModel实例传递给UserView实例,例如:

var userModel = new UserModel,
    userView = new UserView({ model: userModel });
Run Code Online (Sandbox Code Playgroud)