从我的阅读中可以看出,当扩展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() {};
}
这种技术有什么缺点吗?
答案 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所说的那样,只是及时绑定 ,利用可选的第三个参数来保持绑定更加本地化。