BackboneJS:避免调用_.bind()

时间:2015-04-13 19:43:30

标签: javascript backbone.js scope

我正在使用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)
   }

});

我在这个问题的代码库中有很多例子,它有效,但似乎有些被黑了。

所以我的问题是,是否有更优雅的解决方法?

1 个答案:

答案 0 :(得分:3)

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

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

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

在这里,您可以将视图函数func1func2绑定到视图的上下文中。你可以简单地从任何环境中调用它们#34;通常,"使用你的例子:

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);
           });
      )
   }