Dojo声明式与编程式创建带有存储的Select元素

Dojo声明式与编程式创建带有存储的Select元素,dojo,separation-of-concerns,Dojo,Separation Of Concerns,我正在尝试将Select元素与Dojo存储连接起来。Select元素是用HTML声明的,我试图用一些JavaScript代码来存储它 这似乎是建议反对这一点,并赞成在使用存储时通过编程创建Select元素。然而,这对我来说是一个黄旗,因为我喜欢将HTML元素的创建与它们的行为分开。在本例中,如果我可以将Select元素保留在HTML中,并用JavaScript连接存储,那将是非常理想的 Dojo文档中的声明真的是这方面的“最佳实践”吗?我正在寻找经验丰富的Dojo开发人员的意见,因为我仍在为Do

我正在尝试将Select元素与Dojo存储连接起来。Select元素是用HTML声明的,我试图用一些JavaScript代码来存储它

这似乎是建议反对这一点,并赞成在使用存储时通过编程创建Select元素。然而,这对我来说是一个黄旗,因为我喜欢将HTML元素的创建与它们的行为分开。在本例中,如果我可以将Select元素保留在HTML中,并用JavaScript连接存储,那将是非常理想的


Dojo文档中的声明真的是这方面的“最佳实践”吗?我正在寻找经验丰富的Dojo开发人员的意见,因为我仍在为Dojo沾沾自喜

直觉上,人们会使用
select.set(“store”,store)
将store分配/更改为dijit,就像所有小部件一样,但令人惊讶的是,它不起作用

无论如何,有一种方法(也令人惊讶地)并没有被弃用,而且有效

定义
dijit/form/Select
,无需存储:

<select id="select1" data-dojo-type="dijit/form/Select"></select>​
在JSFIDLE上查看它的实际操作:

向上述添加一些糖,我将创建
dijit/form/Select
禁用
,使用单个选项,例如加载。。。以及最终所需的
宽度

<select
    id="select1"
    data-dojo-type="dijit/form/Select"
    data-dojo-props="disabled:true"
    style="width:150px;"
>
    <option>Loading...</option>
</select>​

请在工作中查看此增强版本:

以声明方式调试错误的存储数据/定义可能会变得非常糟糕。此外,当您试图按照声明性构建的选择/存储组合创建多个相同的小部件时,可能会遇到奇怪的麻烦。例如(伪代码):


从理论上讲,通过将mystore绑定到select可以实现您想要的功能,但是如果您要创建多个此小部件,则会与“mystore”发生id冲突。作为一种解决方法,您必须对jsId和商店的id执行类似于jsId=“${id}\u mystore”的操作


如果您想保持声明性行为,一个选项是为您的存储和选择都有附加点,那么您可以在初始化后简单地调用selectwidget.set(“存储”,mystore)。

注意,“setStore”是select特有的,而大多数其他数据小部件都支持set(“存储”,“存储”)@mschr设置存储是否可以与filteringSelect一起使用?我在FS(Dojov1.6)中尝试过它,但它显示了一个错误为
dijit.byId('selected')。setStore不是一个函数…
。使用
set(“store”,…)
尝试时,不会在store中显示新值。你能解释一下为什么会这样吗?已经有一段时间了。。但是,如果商店直接连接到filteringselect(您正在设置它,它很可能会工作)。问题是,没有模型来跟踪事物——换句话说;如果
set(“store”,…)
不起作用,则
FilteringSelect
不会实现
Stateful
。您必须找到重新呈现HTML内容的方法。
设置(查询,”)
有效吗?什么是桥?
<select
    id="select1"
    data-dojo-type="dijit/form/Select"
    data-dojo-props="disabled:true"
    style="width:150px;"
>
    <option>Loading...</option>
</select>​
var select1 = registry.byId("select1");
select1.set("labelAttr", "label");
select1.setStore(store1);
select1.set("disabled", false);
<div dojotype="dojox.data.QueryReadStore" url="someurl/blah.do" jsId="mystore"/>
<select dojotype="dijit.form.FilteringSelect" store="mystore">
</select>