我有一个Dojo UI小部件,其中嵌入了一个小部件。我需要将一个对象传递给这个嵌入式小部件,以便它自己正确设置,但我不知道该怎么做。
我一直在模板中用于包装小部件的嵌入式小部件中进行模板化,例如:
...<div class="thing"
data-dojo-type="mycompany.widgets.ComplexEmbeddedWidget"
data-dojo-props="stuff: '${stuff}'"></div>...
但这似乎不起作用,我想数据可以作为字符串传递?
我通过将其设置为嵌入式窗口小部件中的属性,然后在我的postMixInProperties
函数中引用它来提取此数据。
毫无疑问,这是错误的方法,我应该怎么做才能设置这样的嵌入式窗口小部件?
答案 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对象传递给它,那么这似乎是要走的路。