用于将初始化参数设置为自定义窗口小部件

时间:2018-01-22 20:30:16

标签: dojo

我正在创建自己的基于模板的小部件,我试图在创建时通过构造函数传递一些对象

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执行之前执行或者使其可用,就像我将它们传递给构造函数一样。

2 个答案:

答案 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");
     }