BackboneJS:避免调用 _.bind()

BackboneJS: Avoid calling _.bind()

我正在使用 BackboneJS 框架,运行 遇到这样一种情况,我必须不断地将我的函数包装到 _.bind() 中,以将 this 保持在正确的范围内。

一个例子就是一个简单的 AJAX 调用。 JQuery 默认将 this 更改为 AJAX 请求对象,但我想将我的视图保持为 this:

var AwesomeView = BackboneView.extend({

   firstFunction : function() {
      $.getJSON(
         "/test",
          {},
           _.bind(function(aData) {
               this.secondFunction(aData);
           }, this)
      )
   } ,

   secondFunction : function(aData) {
      console.log(aData)
   }

});

我的代码库中有很多关于这种情况的示例,并且它有效,但似乎有点被黑了。

所以我的问题是,有没有更优雅的方法来解决这个问题?

有两种方法可以避免使用 _.bind 以及其他更优雅的使用方法。

我喜欢在我的代码中使用 _.bind_.bindAll。但我觉得这个实现更优雅一些。

var AwesomeView = BackboneView.extend({
  initialize: function() {
    _.bindAll(this, 'func1', 'func2');
    BackboneView.prototype.initialize.apply(this, arguments);
  },
  ...
});

此处将视图函数 func1func2 绑定到视图的上下文。您可以使用您的示例从任何上下文 "normally," 简单地调用它们:

func1 : function() {
  $.getJSON("/test",{}, this.func2);
},
...

请注意 Function.prototype.bind 在 ECMA 脚本 5.1 中可用。

您也可以使用 call,但它现在看起来与您的代码相似。

   firstFunction : function() {
      var _this = this;
      $.getJSON(
         "/test",
          {},
           function(aData) {
             _this.secondFunction.call(_this, aData);
           });
      )
   }