0

我很确定这是一个范围界定问题,但我有一个主干视图,它使用 Bootbox(一个扩展 twitter 引导程序的小型库)在将模型保存到数据库之前提示确认。该视图负责捕捉 SAVE 按钮单击,此时 Bootbox 对话框应该弹出并提示确认。见下文:

    window.StartView = Backbone.View.extend({

    initialize: function () {
        this.render();
    },  

    events: {
        "click .nextstage"   : "nextstage",
        "click .reshuffle"   : "render",
        "click .drilldone"   : "drilldone"
    },  

    drilldone: function() {

      bootbox.confirm("Record Results?", function(result) {

      result ? this.saveResults : alert("canceled") ;

    }); 

    },

问题是 this.saveResults 永远不会运行。我尝试用“alert(this)”代替它,然后我得到了“Window”,这是有道理的,因为 Bootbox 库是在主 HTML 文档中定义的。那么如何让 Bootbox 调用然后对我的 View 的 saveResults 方法进行回调呢?我必须以某种方式将对该方法的引用传递给 Bootbox 确认方法,对吗?

4

2 回答 2

1

只需将上下文限定在一个变量中,然后调用该函数。(没有括号()它不会运行)

drilldone: function() {
    var self = this;

    bootbox.confirm("Record Results?", function(result) {

        result ? self.saveResults() : alert("canceled") ;

    }); 

},

Javascript 使用范围链来建立给定函数的范围。当你创建一个函数时,你创建了一个新的作用域,这个作用域可以访问在其中声明的每个变量以及在其父级上声明的每个变量(将其视为一个作用域链,一直到全局作用域)。

当没有设置this时,this成为global对象(window在浏览器中)。您可以this使用call,apply或动态更改函数 whitin 的值bind。这就是 jQuery 在其大部分回调中所做的事情(这可能就是你坚持窗口的原因this——但这无关紧要)。

通过分配var self = this,您this可以将引导箱回调范围中可用对象的引用保留为变量。

这是非常简单的概述。您可能有兴趣阅读其他 stackoverflow 答案:JavaScript 中变量的范围是什么?

还有一本名为JavaScript Enlightment的免费书籍触及了这个主题。

于 2013-09-09T21:38:47.557 回答
0

我从未使用过 Backbone,但这看起来并不特定于 Backbone,而是您所建议的范围界定问题。我会尝试:

window.StartView = Backbone.View.extend({

  initialize: function () {
      this.render();
  },  

  events: {
      "click .nextstage"   : "nextstage",
      "click .reshuffle"   : "render",
      "click .drilldone"   : "drilldone"
  },  

  drilldone: function() {
    var ctx = this;
    bootbox.confirm("Record Results?", function(result) {
    result ? ctx.saveResults : alert("canceled") ;
  }); 
},

这有点不太理想,因为重新分配会造成一点内存泄漏,但影响很可能可以忽略不计。

于 2013-09-09T21:40:21.197 回答