我正试图推出一个"扩展"来自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();
});
干杯, 星
答案 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;