2013-10-10 29 views
0

我们已经开始创建一些mixin,扩展了dijits和我们自己的小部件(基于_WidgetBase)的功能。使用1.8声明式,我们使用data-dojo-mixins,解析器完成我们想要的任务。使用mixins对Widget进行编程实例化

但是,在几个地方,我们正在以编程方式实例化小部件。有没有办法告诉Dojo实例化这个类,这个/这些其他类混合在一起?或者我们必须分别使用safeMixin吗?

任何意见将是有益的,谢谢。

回答

1

看起来createSubClass做了什么,我想要的。用我的mixin从原来的课程中创建一门新课程。你可以看到输出在控制台at this jsFiddle

require([ 
     'dojo/_base/declare', 
     'dojo/_base/window', 
     'dijit/_WidgetBase', 
     'dijit/_TemplatedMixin', 
     'dojo/_base/lang' 
    ], 
    function(
     dojoDeclare, 
     win, 
     _WidgetBase, 
     templatedMixin, 
     lang 
    ) { 
    console.clear() 
    var R = dojoDeclare([_WidgetBase, templatedMixin], { 
     templateString : "<div>Go go widget gadget</div>", 
     postCreate : function() { 
      this.inherited(arguments); 
      console.log("r - postCreate"); 
     }, 
     startup : function() { 
      this.inherited(arguments); 
      console.log("r - startup"); 
     } 
    }); 

    var M = dojoDeclare([], { 
     postCreate : function() { 
      console.log("m - postCreate"); 
      this.inherited(arguments); 
      console.log("m - postCreate after inherited"); 
     } 
    }) 

    var X = R.createSubclass(M); 
    var r = new X(); 

    console.log([X, R]); 

    r.placeAt(win.body()); 

    r.startup(); 
}); 
1

这里是我怎么总是创建扩展_WidgetBase我的自定义部件:

define([ 
    'dijit/_WidgetBase', 
    'path/to/module1', 
    'path/to/module2' /* etc. */ 
], function(WidgetBase, module1, module2) { 

    /* Here you can define your module's functions */ 

    var myVar = 42; 
    var foo = function(num){ 
     alert("My var is " + myVar); 
    }; 

    return declare([WidgetBase], { 

     /* This is the widget you are creating. Public variables should go here */ 

     myGlobalVar = "I did stuff", 
     doStuff: function(a, b) { 
      module1.doSomething(a); 
      module2.doSomethingElse(b); 
      alert(this.myGlobalVar); 
     }, 
     callDoStuff: function() { 
      alert("I'm gonna doStuff"); 
      this.doStuff(3, 5); 
     } 
    }); 

}); 

当然,如果你只是想以编程方式扩展插件,你可以随时落回用dojo._base.lang::extend()(字面扩展小部件)或dojo._base.lang::mixin()(修改小部件的原型)。

DojoToolkit website

require(["dojo/_base/lang", "dojo/json"], function(lang, json){ 
    // define a class 
    var myClass = function(){ 
    this.defaultProp = "default value"; 
    }; 
    myClass.prototype = {}; 
    console.log("the class (unmodified):", json.stringify(myClass.prototype)); 

    // extend the class 
    lang.extend(myClass, {"extendedProp": "extendedValue"}); 
    console.log("the class (modified with lang.extend):", json.stringify(myClass.prototype)); 

    var t = new myClass(); 
    // add new properties to the instance of our class 
    lang.mixin(t, {"myProp": "myValue"}); 
    console.log("the instance (modified with lang.mixin):", json.stringify(t)); 
}); 
+0

这不是关于创建自定义窗口小部件,而是同时保留窗口小部件基础的生命周期方法,类似于分析器是如何做的与数据功能混合到一个现有的小部件-dojo道具。考虑到解析器给出的更便宜的代码,我可能会完成同样的事情,即从继承自小部件的私有类中继承,并在我的扩展中混合使用,但看起来好像比我需要的代码更多。 –

+0

@ Ray Wadkins,他的答案的第二部分涵盖了这一点。使用'dojo/_base/lang :: extend()'将指定的mixin混入所有现有的A类小部件中,或者使用'dojo/_base/lang :: mixin()'将A类型的单个小部件混合到指定的混入。 – g00glen00b

+0

如果mixin包含postCreate方法(使用this.inherited(arguments)),它将在小部件生命周期中被调用,与用于declare的mixin相同? –