为什么多个以编程方式生成的FilteringSelect不能共享一个商店?

时间:2010-05-07 20:10:29

标签: javascript dojo

在您提出要求之前,在这种情况下,MultiSelect对用户来说并不是非常直观。
我有一个对象,数组作为'items'的值,在var语句的页面上提供。我还有一个生成并放置dijit.form.FilteringSelect的函数,并在某个按钮的click事件中触发。这些选择中的每一个都应该具有前述对象作为其“存储”属性。如果我在选择初始化代码中写store: new dojo.data.ItemFileReadStore({ data: object_name }),,我会发现奇怪的行为:
我单击生成按钮2次,得到2个FilteringSelects(称之为A,B)。我点击了B的下拉片,然后菜单显示为B.然后我点击了A的下拉按钮,菜单显示为附加到A.如果我再返回并再次点击B的下拉按钮,则没有任何反应(好吧什么都没有;抛出错误)。
但是,如果相反,我有data: {items: array_literal}一切正常,我会尽可能多地在2之间来回切换。
由于data:语句在javascript代码中出现一次,这不是什么大问题(现在我至少有一个解决方法)。然而,这非常奇怪。我试图深入研究源代码,但无济于事。
有人知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

原因是您在创建data时传递了dojo.data.ItemFileReadStore参数。商店直接使用该对象。在源代码中,您可以看到this._arrayOfTopLevelItems = dataObject.items;。因此,您创建的两个存储使用与后端存储相同的数组对象。因此,您在一个小部件中所做的更改也会更改另一个小部件。通过使用数组文字,您实际创建了两个不同的对象,那么它应该没问题。两个小部件不会相互干扰。

我对此案例的解决方案是使用dojo.clone创建数据副本,然后使用副本创建商店。