试图从dijit Button派生:" TypeError:this._attachEvents未定义"

时间:2015-05-18 09:29:24

标签: dojo dijit.form

我正试图推出一个"扩展"来自dijit / Form / Button的按钮。 (我想将额外的参数传递给构造函数,并且我希望将这些准备工作封装在我的派生类中.Button只是一个例子,我想稍后使用它与网格和树。)

不幸的是,下面的代码失败了" TypeError:this._attachEvents未定义"在firefox javascript控制台中。有些想法,有什么不对?相同的代码(包括最小的HTML)已准备好在http://jsfiddle.net/x9dLs8gz/1/

运行
require(["dojo/_base/declare", "dijit/form/Button", "dojo/dom", "dojo/json", "dojo/domReady!"],

function (declare, Button, dom, json) {
    declare("MyButton", Button, {
        "-chains-": {
            constructor: "manual"
        },
        constructor: function () {
            //extra calculation will go here...
            this.inherited(arguments);
        }
    });
    new MyButton({
        label: "Click Me!",
        onClick: function () {
            dom.byId("result").innerHTML += "Success";
        }
    }, "button").startup();
});

干杯, 星

2 个答案:

答案 0 :(得分:1)

如果"-chains-"方法的constructor值未设置或设置为"after",则会在所有继承的postscript方法之后调用constructor方法1}}被解雇了。另一方面,在指定"manual"时,postscript会在执行第一个constructor(在本例中为MyButton#constructor)后触发。因此,在_AttachMixins#buildRendering中设置this._attachEvents之前会触发_AttachMixins#constructor,从而导致您看到的错误。

由于指定"manual"意味着不会假设任何链接,因此即使this.inherited被正确地调用链,mixin构造函数也将从不被调用。这是有道理的,因为底层C3MRO被抛出窗口。

如果您需要继续使用"manual"设置,则需要1)自己重新创建任何缺失数据,2)手动调用mixin构造函数(例如_AttachMixin.prototype.constructor.call(this)),或者3)将MyButton转换为Button的工厂:

var createButton = (function () {
    var myButtonDefaults = { ... };

    return function (kwArgs, id) {
        var buttonId = id || 'button';
        return new Button(lang.mixin({}, myButtonDefaults, kwArgs), buttonId);
    };
})();

var myButton = createButton();
myButton.startup();
console.log(myButton instanceof Button); // true

答案 1 :(得分:0)

您需要将声明的类分配给变量或在不同的文件中声明,并将其添加到require中的对象列表中。也不要使用像" constructor"这样的关键字的变量名。下面是您示例的固定版本。



require(["dojo/_base/declare", "dijit/form/Button", "dojo/dom", "dojo/json", "dojo/domReady!"],

  function(declare, Button, dom, json) {
    var MyButton = declare("MyButton", Button, {
      "-chains-": {
        constructorType: "manual"
      },
      constructor: function() {
        //extra calculation will go here...
        this.inherited(arguments);
      }
    });
    new MyButton({
      label: "Click Me!",
      onClick: function() {
        dom.byId("result1").innerHTML += "Success";
      }
    }, "button").startup();
  });

<div id="button"></div>
<div id="result1"></div>
&#13;
&#13;
&#13;