我使用Backbone.js实现了一个简单的登录系统.
我试图使用HTTP POST方法将用户名和密码传递给处理用户身份验证的Controller类.
public function sessions() { if ($this->input->server('REQUEST_METHOD') == 'POST') { $this->login(); } elseif ($this->input->server('REQUEST_METHOD') == 'GET') { $this->index(); } elseif ($this->input->server('REQUEST_METHOD') == 'DELETE') { $this->session->sess_destroy(); $this->index(); } }
Backbone.js代码段:
$(document).ready(function() { var Session = Backbone.Model.extend({ url: function() { var link = "http:///reddit/index.php/welcome/sessions"; return link; }, defaults: { username: null, password: null } }); var model = new Session(); var DisplayView = Backbone.View.extend({ el: ".complete", model: model, type: 'POST', initialize: function() { this.listenTo(this.model, "sync change", this.gotdata); }, events: { "click #signin": "getdata" }, getdata: function(event) { event.preventDefault(); var username = $("input#username").val(); var password = $("input#password").val(); this.model.set({ username: username, password: password }); this.model.fetch(); }, gotdata: function() { console.log(this.model.get('username')); console.log(this.model.get('password')); $("#base-nav").load(location.href + " #base-nav"); $("#signin-form").load(location.href + " #signin-form"); } }); var displayView = new DisplayView(); });
我type
当前使用了属性来定义HTTP方法类型POST.但这似乎不起作用,因为只有使用开发人员控制台才能观察到GET请求.
需要注意的是,当我删除event.preventDefault();
时会在单击链接时阻止页面重新加载(防止Backbone pushState上的完整页面重新加载),尽管页面重新加载阻止了预期的目标行为,但POST请求似乎已成功传递到后端.
我们如何使用Backbone.js的POST请求轻松发送数据?
您正在使用this.model.fetch();
哪个用于检索数据.它默认发出GET请求,不会在正文或查询字符串中发送任何数据.
在尝试查找选项和功能时,请使用文档.该骨干网的源代码也短,易于遵循.
快速解决使用保存
this.model.save();
要强制执行POST请求,例如,如果模型ìd
在您已登录时具有集合并且只想再次验证登录,请使用该type
选项以避免PUT
或PATCH
请求Backbone确定它是更新而不是创建调用.
this.model.save(null, { type: 'POST' });
传递给选项save
,fetch
,create
和destroy
,所有这些使用Backbone.sync
,也传递给jQuery的ajax
功能.
首先,不要用PHP生成JS.
然后,在Session
模型中创建一个函数来处理登录.您甚至可以完全避免Backbone REST功能,因为它不适合登录请求的用例.
使用模型很有用,因为它提供了常见的Backbone事件,并且它适用于插件,例如登录表单视图中的双向绑定.但调用save
到登录并不清楚什么应该做的.这就是为什么我们应该为Session
模型提供清晰的API .
var Session = Backbone.Model.extend({ urlRoot: "http://example.com/reddit/index.php/welcome/sessions", defaults: { username: null, password: null }, // hide the login complexity inside a function login: function(options) { // for a really simple login, this would be enough return this.save(null, { type: 'POST' }); // for anything more complex, make a custom call. return Backbone.ajax(_.extend({ url: this.url(), method: "POST", data: this.attributes, dataType: "json", }, options)); }, // provide other functions for a clear and simple to use API. logout: function(){ /*...*/ }, isAuthenticated: function(){ /*...*/ } });
然后登录:
var session = new Session(); // in the view render: function() { // caching jQuery object and uses the view's `$` function to scope // the search to the view element only. this.$username = this.$("input#username"); this.$password = this.$("input#password"); return this; }, getdata: function(){ session.set({ username: this.$username.val(), password: this.$password.val(), }); session.login({ context: this, success: this.onLoginSuccess }); }
我个人使用的骨干会话插件保存在auth token
中localStorage
.它提供了一个很好的API开箱即用,并使用save
和fetch
同步localStorage
.
ajax
通话?Backbone提供了根据REST原则与服务器save
同步attributes
,这为login
不需要ID或发出PUT/PATCH请求的服务增加了大量开销.
你经常会最终与Backbone作斗争.
更多信息
是什么区别$el
和el
什么的缓存jQuery的对象?
使用Backbone.session创建帐户服务
如何强制POST请求?