【问题标题】:Accessing both parent object, and calling object, in callback?在回调中访问父对象和调用对象?
【发布时间】:2011-06-11 06:08:17
【问题描述】:

我有一个库提供的函数,它在一些处理后运行回调。

在该回调中,我想访问其方法启动该回调的父对象 - 见下文。

class MaskMaker
  addMaskedImage: (imagefile, texturefile, canvasid) ->
    $('<img src="'+imagefile+'">').load ->
      console.log('Id like to call another MaskMaker method with @width as a parameter')

显然 => 将允许我以 this/@ 访问父对象,-> 将允许我以 this/@ 访问触发回调的元素。但是最好的方法是什么,例如,所以我可以使用图像宽度作为参数调用 MaskMaker 的直接方法?我需要 that = this hack 还是有更好的东西?

谢谢!

【问题讨论】:

    标签: javascript object this coffeescript


    【解决方案1】:

    但是最好的方法是什么,例如,我可以调用 MaskMaker 的直接方法,将图像宽度作为参数?

    你不能同时选择两者(显然),所以必须选择=&gt; + event.target

    $('<img src="'+imagefile+'">').load (ev) => @method ev.target.width
    

    还是不错的

    that = this
    $('<img src="'+imagefile+'">').load -> that.method @width
    

    另请参阅:https://github.com/jashkenas/coffee-script/issues/1230

    【讨论】:

    • 第一个解决方案正是我正在寻找的 - 不需要“那个”或“自我”黑客。 JQuery 文档提到您可以显式传递对象 - api.jquery.com/load-event - 但我错过了这一点。非常感谢。
    【解决方案2】:

    如果我完全理解您的代码结构,您可以添加一个变量来保存对 MaskMaker 实例的引用。由于范围的原因,您将能够看到更进一步的链条。

    class MaskMaker
      var self = this;
      addMaskedImage: (imagefile, texturefile, canvasid) ->
        $('<img src="'+imagefile+'">').load ->
          console.log('Id like to call another MaskMaker method with @width as a parameter')
          //self references MaskMaker now, so you can call self.addMaskedImage for example
    

    【讨论】:

    • 这很好用(用 'self = @' 替换 'var self = this;'。我想知道(我已经编辑了要说的问题)coffeescript 中有什么内置的可以避免做这种事情。但我怀疑不是:你可能在你想引用的对象下面有很多函数,而 JS/CS 无法知道你特别想调用哪个函数。
    • 我不能说 Coffeescript 有没有,但 Javascript 没有。
    【解决方案3】:

    在 MaskMaker 范围内定义和绑定你的回调:

     class MaskMaker
         afterAdd => console.log('Id like to call another MaskMaker method with @width as a parameter')
         addMaskedImage: (imagefile, texturefile, canvasid) ->
             $('<img src="'+imagefile+'">').load -> afterAdd()
    

    请注意,我使用粗箭头语法=&gt; 将存储在afterAdd 中的函数绑定到MaskMaker。

    【讨论】:

    • 这不起作用。首先,您的意思是afterAdd = =&gt; ...。然而,更重要的是,afterAdd 绑定到 MaskMaker 构造函数,而不是实例。
    • NM,您是故意绑定到构造函数的。我的错。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多