Javascript Backbone.js中的变量范围
我在Backbone.js中有一个web应用程序,它使用条带支付系统 这是模型代码的一部分:Javascript Backbone.js中的变量范围,javascript,backbone.js,scope,Javascript,Backbone.js,Scope,我在Backbone.js中有一个web应用程序,它使用条带支付系统 这是模型代码的一部分: App.Models.Payment = Backbone.Model.extend({ defaults: { id:null }, url: function() { // code }, initialize:function(){ this.id=''; this.saveClicked= false; this.saveDetailsC
App.Models.Payment = Backbone.Model.extend({
defaults: {
id:null
},
url: function() {
// code
},
initialize:function(){
this.id='';
this.saveClicked= false;
this.saveDetailsChecked= true;
}
此视图中使用此模型:
App.Views.BillingView = Backbone.View.extend({
el: '#billing-fields',
events: {
'click #billing-footer-buttons .navigation .confirm-btn': 'saveCardClicked'
},
initialize:function(models, options) {
Stripe.setPublishableKey('**********************');
var self = this;
},
saveCardClicked:function(e) {
e.preventDefault();
if (this.model.saveClicked) return false;
this.model.saveClicked = true;
var $form = $('#payment-form');
Stripe.createToken($form, this.stripeResponseHandler);
},
cancelClicked:function() {
vent.trigger('showScreen', 'subscribe-container');
},
stripeResponseHandler:function(status, response) {
var $form = $('#payment-form');
self.saveDetailsChecked = document.getElementById("billing-checkbox").checked;
var atr1 = document.getElementById("billing-card-number").value;
var atr2 = self.model.savedCard;
if(document.getElementById("billing-card-number").value == self.model.savedCard){
self.model.set('use_saved_card','1');
vent.trigger('doPayment');
}else{
if (response.error) {
// code
} else {
// code
}
}
self.saveClicked = false;
}
});
在saveCardClicked函数中,我可以访问模型中的变量,就像saveClicked变量一样
但在stripeResponseHandler中,我无法从模型中访问“saveClicked”变量,在该函数中,这指的是窗口,在initialize函数中定义的自变量也无法访问
stripeResponseHandler是从Stripe API调用的
是否有任何方法可以访问stripeResponseHandler函数中的savedCard变量,或者应该使用全局变量?尝试使用以下方法:-
Stripe.createToken($form, this.stripeResponseHandler.bind(this));
当然,您可以使用
bind
Bind通过将参数绑定到某个函数调用来工作,并将返回一个函数,在调用该函数时,该函数将被传递给调用Bind时声明的参数(加上实际上未声明的任何其他预期参数)。有一个特殊参数要传递给bind
。第一个,调用函数时将使用这个
对象
那么,你要做的就是打电话
Stripe.createToken($form, this.stripeResponseHandler.bind(this));
在这里,您声明了一个回调(stripeResponseHandler),当调用它时,它将把this
作为this
对象(我知道这个短语很复杂,但我想您已经理解了)
此外,请记住,您的产品线
var self = this;
无法正常工作,因为它的作用域是
初始化
函数,因此在其外部不可见。我认为需要解释一下。理解一个问题从来都不是一件好事。bind方法将函数绑定到所需的上下文。Stripe.createToken($form,this.stripeResponseHandler)//在条带下调用,通过将其绑定到主干,将其上下文更改为条带,而不是主干。您已将其上下文更改为主干。'工作不正常,其作用域为initialize函数,有没有办法让变量在整个视图中具有作用域?this.variable=which
将使变量在整个视图中可见。