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
    },
    // ...
});