避免需要在骨干网中调用_.bindAll

时间:2013-07-31 20:32:48

标签: javascript backbone.js

从我的阅读中可以看出,当扩展Backbone.js类(如Model)时,一个相当常见的模式是在构造函数中调用_.bindAll,如下所示(参见https://raw.github.com/eschwartz/backbone.googlemaps/master/lib/backbone.googlemaps.js):

GoogleMaps.Location = Backbone.Model.extend({
  constructor: function() {
    _.bindAll(this, 'select', 'deselect', 'toggleSelect', 'getLatLng', 'getLatlng');
    // etcetera

我确实理解为什么要这样做,但显然将方法名称传递给_.bindAll的需要似乎是一个维护问题 - 如果添加新方法,你必须记住将它们作为参数添加到_.bindAll同样。

今天早些时候,我在这里发布了一个有点冗长的解决方案:https://stackoverflow.com/a/17977852/34806

但是,以下简单的技术是否应该完全避免需要调用_.bindAll?也就是说,而不是分配“自定义”方法的习惯方式,而是将它们全部附加到构造函数中的“this”:

constructor: function() {
    this.foo = function() {};
    this.bar = function() {};
}

这种技术有什么缺点吗?

3 个答案:

答案 0 :(得分:1)

您的技术不起作用,您仍然需要像其他方法一样绑定这些方法。或者使用像var this = self之类的东西,但那些方法不能用于子类或其他任何地方。

只需在你需要的时候完全摆脱bindAll和bind,例如将方法作为回调传递到某处时。它应该更容易维护,因为家务活是本地化的。在将方法作为回调传递时忘记绑定最终应该会忘记使用var

答案 1 :(得分:0)

最简单的解决方案似乎是将'this'作为可选的第三个参数传递;见:http://documentcloud.github.io/backbone/#FAQ-this

答案 2 :(得分:0)

这需要明确地将方法的名称传递给你想要绑定的_BindAll实际上是一个非常新的change,因为下划线.js 1.5.0 - 7/6/13 ,如果您查看该版本的change log,您会看到为此更改提供的以下原因

  

删除了在没有方法名称参数的情况下调用_.bindAll的功能。   将这些方法的名称列入白名单几乎总是更明智   你想绑定。

那说最好像Esailija所说的那样,只是及时绑定 ,利用可选的第三个参数来保持绑定更加本地化。