我正在创建自己的基于模板的小部件,我试图在创建时通过构造函数传递一些对象
var widget = new myWidget(obj1, obj2, obj3);
我的小部件构造函数看起来像
constructor: function(param1, param2, param3)
但是我遇到了一些错误,发现它们是由于_WidgetBase功能(特别是创建方法)所期望的,它在第一个和第二个参数中需要特殊的东西。
create: function(params, srcNodeRef)
因此,为了避免我的参数中断params,以及在第一和第二位置预期的srcNodeRef,我不得不将我的参数移到第二个位置之后
constructor: function (params, srcNodeRef, myParam1, myparam2, myParam3)
但是,与通常的面向普通面向对象语言的对象实例化方法相比,这自然不是解决这个问题的预期方法(例如c#)
我的问题是,是否有推荐的模式将初始化参数传递给自定义小部件构造函数,这避免了必须记住第一个和第二个参数位置被保留的问题?
注意: 一个重要的注意事项是,无论我发送到窗口小部件的任何参数,都必须在 postCreate执行之前执行或者使其可用,就像我将它们传递给构造函数一样。
答案 0 :(得分:2)
实际上,有一个" dojo"将参数传递到窗口小部件的方法:
var widget = new myWidget({obj1: obj1, obj2: obj2});
在您的小部件实例中,这些对象将引用
this.obj1, this.obj2
。你不必覆盖构造函数。
关于此主题的_WidgetBase的dojo源代码的一些注释:
//////////// INITIALIZATION METHODS ///////////////////////////////////////
/*=====
constructor: function(params, srcNodeRef){
// summary:
// Create the widget.
// params: Object|null
// Hash of initialization parameters for widget, including scalar values (like title, duration etc.)
// and functions, typically callbacks like onClick.
// The hash can contain any of the widget's properties, excluding read-only properties.
// srcNodeRef: DOMNode|String?
// If a srcNodeRef (DOM node) is specified:
//
// - use srcNodeRef.innerHTML as my contents
// - if this is a behavioral widget then apply behavior to that srcNodeRef
// - otherwise, replace srcNodeRef with my generated DOM tree
},
=====*/
答案 1 :(得分:1)
我对基里尔的答案给予了1分,因为这是最简单的。但是从其他评论来看,您可能需要按下输入或根据输入初始化其他变量。
如果有,请查看postMixinProperties
lifecycle method并在窗口小部件中覆盖它。如果您的窗口小部件是模板化的,并且模板需要按摩数据,那么您需要这样做。在这里,您可以按预期使用this
来引用您的媒体资源。
postMixInProperties: function(){
// summary:
// Called after the parameters to the widget have been read-in,
// but before the widget template is instantiated. Especially
// useful to set properties that are referenced in the widget
// template.
// tags:
// protected
},
不要忘记在所有dijit生命周期方法中调用this.inherited(arguments);
。
为您定义属性的setter是另一种按摩这些属性的方法。如果模板将使用这些属性,您将需要这个。来自Writing Widgets page的setter示例。所以这里'open'将是传递给构造函数或小部件模板的参数名称。
_setOpenAttr: function(/*Boolean*/ open){
this._set("open", open);
domStyle.set(this.domNode, "display", open ? "block" : "none");
}