Javascript 从嵌套d3函数中引用主干函数
我试图从主干Javascript 从嵌套d3函数中引用主干函数,javascript,backbone.js,d3.js,Javascript,Backbone.js,D3.js,我试图从主干渲染函数中的d3函数中引用主干函数。我现在必须引用其他主干功能,以执行一些主干功能,但不能通过使用this/that方法(我使用this/ƒthis)引用它们来访问它们: 如何从D3代码内部访问主干切换功能 错误代码来自toggle函数本身(以前工作过,所以我正在尝试找出为什么现在没有),错误出现在313,而不是314,我的浏览器控制台总是一行关闭。我放了一个console.log()来查看函数中的ƒthis.toggle,但是在切换bool值时出错了 311 toggle: fun
渲染函数中的d3函数中引用主干函数。我现在必须引用其他主干功能,以执行一些主干功能,但不能通过使用this/that方法(我使用this/ƒthis)引用它们来访问它们:
如何从D3代码内部访问主干切换
功能
错误代码来自toggle函数本身(以前工作过,所以我正在尝试找出为什么现在没有),错误出现在313,而不是314,我的浏览器控制台总是一行关闭。我放了一个console.log()来查看函数中的ƒthis.toggle,但是在切换bool值时出错了
311 toggle: function(){
312 //switch the selected boolean value on the model
313 this.model.set('selected', !this.model.get('selected'));
314 //re-render it, passing the clicked beat to render()
315 this.render(this.model);
316 // log.sendLog([[1, "beat" + this.model.cid + " toggled: "+!bool]]);
317 dispatch.trigger('beatClicked.event');
318 }
我从渲染模板中的圆切换到让d3创建它(这样我们可以使用d3函数设置它的动画),我认为不知何故,对象已经失去了与模型的绑定。这不是D3/主干网的问题,只是Javascript。除非以某种方式绑定对象方法,否则不能传递稍后调用的对象方法,并期望this
在该方法中工作:
var myObject = {
method: function() {
this.doSomeStuff();
},
doSomeStuff: function() {
console.log("stuff!");
}
};
myObject.method(); // "stuff!"
// pass this method somewhere else - this is
// effectively what you do with an event handler
var myMethod = myObject.method;
myMethod(); // TypeError: Object [object global] has no method 'doSomeStuff'
第二部分失败,因为调用myObject.myMethod()
会将此
绑定到myObject
,但将该方法分配给变量(或将其分配为事件处理程序)并不成功(在大多数情况下,此
绑定到窗口
,但D3会将此
重新分配给您设置处理程序的DOM元素)
标准修复程序是1)将其包装在函数中:
var myMethod = function() {
myObject.method();
};
myMethod(); // "stuff!"
或者2)以某种方式将其绑定到对象,例如,在主干初始化
方法中(下划线为此提供了一个有用的\u.bindAll
实用程序):
您已经回答了您的问题-您使用fthis保存了对此的引用,并使用fthis引用视图中定义的切换函数object@kinakuta实际上,他甚至不需要这个fthis
。这不是一个异步调用,因此将直接计算该.toggle
。我在这里看到的唯一可能是错误的是调用toggle
方法时的上下文。这个。toggle
不起作用,获取匿名函数错误未捕获类型错误:无法调用未定义beatView.js:314 Backbone.View.extend.toggle beatView.js:314(匿名函数)的方法“get”
指出d3是罪魁祸首:函数d3_选择_onListener(listener,argumentz){返回函数(e){var o=d3.event;d3.event=e;argumentz[0]=这个。{code>hrm,看起来函数本身可能有问题,看看它是否有问题。@Loamhoof您能解释一下,或者链接到您所说的异步调用吗?还有,你能解释一下上下文吗?
var myMethod = function() {
myObject.method();
};
myMethod(); // "stuff!"
Backbone.View.extend({
initialize: function(options){
_.bindAll(this, 'toggle');
// now you can pass this.toggle around with impunity
},
// ...
});