0

我在 Backbone.js 中有使用 Stripe 支付系统的 Web 应用程序。

这是模型代码的一部分:

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”变量,在此函数中 this 指的是窗口,并且在初始化函数中定义的 self 变量也无法访问。

stripeResponseHandler 从 Stripe API 调用。

有什么方法可以访问 stripeResponseHandler 函数中的 savedCard 变量,或者我应该使用全局变量?

4

2 回答 2

1

尝试使用这个: -

Stripe.createToken($form, this.stripeResponseHandler.bind(this));
于 2013-06-07T12:40:58.460 回答
1

当然,您可以使用bind.

Bind 通过将参数绑定到某个函数调用来工作,并将返回一个函数,在调用该函数时,将传递您在调用 bind 时声明的参数(实际上,还有您未声明的任何其他预期参数)。有一个特殊的参数要传递给bind. 第一个,它是this调用函数时将使用的对象。

所以,你要做的就是打电话

Stripe.createToken($form, this.stripeResponseHandler.bind(this));

在这里,您声明了一个回调(stripeResponseHandler),当被调用时,它将this作为this对象(我知道这个短语很复杂,但我想你明白了)。

另外,请记住,您的线路

var self = this;

无法正常工作,因为它仅限于initialize函数,因此在函数之外不可见。

于 2013-06-07T12:47:18.100 回答