【问题标题】:How the object created by dojo.declare can access its own properties?dojo.declare 创建的对象如何访问自己的属性?
【发布时间】:2013-10-16 07:47:17
【问题描述】:

在使用 Dojo/_base/declare 创建的 Dojo 类类对象时,我遇到了一些概念问题。

我创建了以下模块:

define(["dojo/_base/declare", ....], function(declare,....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

问题是,函数newItem 不起作用,因为当它通过按钮单击调用时,this 指向 Button 小部件,而不是“my.widget”实例。

我很困惑。如何引用“my.widget”实例?在我读过的 Dojo 类中,当前实例在 this 下可用。

【问题讨论】:

  • 对于openDialog 函数,请记住,有时它比return a Promise 更简洁,而不是需要回调作为参数。

标签: javascript dojo declare


【解决方案1】:

如果你想用正确的范围调用newItem,你可以使用dojo/_base/langhitch()函数。

define(["dojo/_base/declare", "dojo/_base/lang", ....], function(declare, lang, ....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       new Button({onClick: lang.hitch(this, "newItem"}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
});

hitch() 函数将确保 this 引用正确。这听起来像是真正的魔法,但它使用屏幕后面的某种反射来执行该功能。

它真正的作用是使用Function.prototype.apply 函数来启动魔法。正如您在this article 中看到的那样,它接受上下文和参数。所以它实际上会在执行newItem 时更改this 引用。

【讨论】:

  • 好的,但这不是问题。问题是,对于 newItem 函数,“this”是 Button,而不是“myInstance”。 'myInstance' 仅在 'startup' 函数中可见。
  • @ŁukaszL。修复。它与 Chris Hayes 发布的几乎相同,但使用了新的 AMD 语法。
  • 没错,就是这样!我仍然无法理解“搭便车”在做什么。
  • 我编辑了我的答案以解释 hitch 的作用。在屏幕后面,它使用某种反射来做神奇的事情。有一个名为apply 的函数允许您修改this 所指的内容。
  • 然而,知道要搜索什么,我在 Dojo 代码中发现了 lang.hitch 的多种用法,所以您的答案是 Dojo 中的规范处理方式。
【解决方案2】:

您可以使用dojo.hitch 将上下文附加到函数:

define(["dojo/_base/declare", ....], function(declare,....){
    var myFunc = dojo.hitch(this, function() { 
       this.openDialog({}, this.saveItemCallback)
    });

    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: myFunc,
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

通过这样做,您实际上是在声明在传递给 dojo.hitch 的匿名函数中,this 指的是传递的第一个参数(可以是任何对象)。

【讨论】:

  • 这样做我什至在创建对象之前就遇到了错误,在 myFunc 声明中:'this.openDialog is undefined'
猜你喜欢
  • 2011-03-07
  • 2017-02-13
  • 2019-03-30
  • 1970-01-01
  • 2011-03-20
  • 2013-06-19
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多