将对象传递给模板中的小部件

时间:2012-07-12 14:08:07

标签: dojo

我有一个Dojo UI小部件,其中嵌入了一个小部件。我需要将一个对象传递给这个嵌入式小部件,以便它自己正确设置,但我不知道该怎么做。

我一直在模板中用于包装小部件的嵌入式小部件中进行模板化,例如:

...<div class="thing"
        data-dojo-type="mycompany.widgets.ComplexEmbeddedWidget"
        data-dojo-props="stuff: '${stuff}'"></div>...

但这似乎不起作用,我想数据可以作为字符串传递?

我通过将其设置为嵌入式窗口小部件中的属性,然后在我的postMixInProperties函数中引用它来提取此数据。

毫无疑问,这是错误的方法,我应该怎么做才能设置这样的嵌入式窗口小部件?

3 个答案:

答案 0 :(得分:1)

我认为如果您打算使用这种方法,您希望在将javascript对象json传递给模板化的嵌入式窗口小部件之前将其转换。

您可以通过要求'dojo / json'并执行

轻松完成此操作
this.stuff=jsonModule.stringify(this.stuffAsObject);

正如您已经发现的那样,如果您要设置更复杂的属性,程序化实例化可能就是您的选择。

答案 1 :(得分:1)

如果你的mycompany.widgets.ComplexEmbeddedWidget一旦初始化(在构造函数中),就会急切地想要设置对象'stuff',那么我不确定这种方法会做什么,但是一个简单的修复可能就是删除'引号' $ {东西}?

基本上你用dijit / _TemplatedMixin派生小部件会发生什么。反过来,在buildRendering期间,在'this'(小部件)上调用_stringRepl。我不完全确定流程,因为你正在使用WidgetsInTemplate ..

例如,让我们通过标记将窗口小部件属性设置为数组:

<div 
   data-dojo-type="dijit.form.Select" 
   data-dojo-props="options:[ 'val1', 'val2']">
</div>

如您所见,该值周围没有引号 - 或者它将呈现为字符串。然后让您将ComplexEmbedded模板更改为

dojo.declare("exampleName", [_WidgetsInTemplateMixin, _TemplatedMixin], {
 templateString: '<div class="outerWidgetDomNode">
  ...
  <div class="thing"
    data-dojo-type="mycompany.widgets.ComplexEmbeddedWidget"
    data-dojo-props="stuff: ${stuff}"></div>
  ...
'
});

要使用对象实例化ComplexEmbeddedWidget.stuff,这需要是一个字符串。 _Templated使用dojo.string.substitute,如果给定深层嵌套对象,则可能会失败。

标记示例:

<div data-dojo-type="exampleName" data-dojo-props="stuff: '{ json:\'Representation\', as:\'String\'}'"></div>

或通过程序化

var myObj = { obj:'Representation', as:'Object' };
var anExampleName = new exampleName({
    stuff: dojo.toJson(myObj) // stringify here
}, 'exampleNode');

让我们知道怎么回事,我一直想用这个嵌入小部件来研究流的表现形式一段时间:)

答案 2 :(得分:0)

您可以以编程方式插入小部件。如果插入的小部件需要将JavaScript对象传递给它,那么这似乎是要走的路。