2

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

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

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

但这似乎不起作用,我猜数据可能是作为字符串传递的?

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

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

4

3 回答 3

1

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

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

this.stuff=jsonModule.stringify(this.stuffAsObject);

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

于 2012-07-12T17:23:18.627 回答
1

如果您mycompany.widgets.ComplexEmbeddedWidget迫切希望在初始化后(在构造函数中)设置对象'stuff',那么我不确定这种方法是否可行,但是一个简单的修复可能是删除 ${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');

让我们知道进展如何,我一直想通过这种将小部件嵌入模板内容来研究流的存在有一段时间了 :)

于 2012-07-21T14:32:14.080 回答
0

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

于 2012-07-12T16:56:44.170 回答