0

从我的阅读看来,在扩展 Backbone.js 类(如 Model)时,一种相当常见的模式是在构造函数中调用 _.bindAll,如下所示(参见https://raw.github.com/eschwartz/backbone.googlemaps/主/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() {};
}

这种技术有什么缺点吗?

4

2 回答 2

1

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

只需完全摆脱 bindAll 并bind在您需要时及时删除它,例如在某处将方法作为回调传递时。维护工作应该容易得多,因为这项工作是本地化的。在将方法作为回调传递时忘记绑定最终会感觉像忘记使用var.

于 2013-07-31T20:38:46.950 回答
0

如果您查看该版本的更改日志,那么您需要将方法名称显式传递给要绑定的_BindAll实际上是 underscore.js 1.5.0 - 7/6/13 的最近更改您将看到针对该更改给出的以下原因

删除了在没有方法名称参数的情况下调用 _.bindAll 的能力。将要绑定的方法的名称列入白名单总是更明智的做法。

也就是说,最好按照Esailija所说的去做,并通过使用可选的第三个参数来及时绑定它,这会使绑定更加本地化。

于 2013-07-31T21:17:31.410 回答