我想我已经完成了困难的事情。我有一个带有2个过滤选择框的表单。第一个是由3个值的硬编码数组填充(稍后将生成动态)。当我选择值时,我有一个json-rpc调用转到我的数据库并返回我想要的第二个框的值。把它想象成国家选择美国 - 数据库只返回美国城市填充第二个框。
这是我的Javascript填充第二个文本框:
function category_changed()
{
var store = directoryBroker.getSubCategorys(document.getElementById('categoryId').value);
store.addCallback(
function (response)
{
var result = dojo.eval("(" + response + ")");
if (typeof(result)!='undefined')
{
document.getElementById('subCategoryId').disabled = false;
document.getElementById('subCategoryId').value = result[0].id;
}
}
);
}
这是用于创建表单的php:
$category = new Zend_Dojo_Form_Element_FilteringSelect('categoryId');
$category
->addMultiOption('a', '-- Please Select --')
->addMultiOptions($directoryModel->getAllCategorysForSelect())
->setValue('a')
->setRequired(true)
->setAttribs(
array(
'style' => 'width: 400px',
'onchange' => 'JavaScript: category_changed();'
)
)
->setLabel("Category:")
->addFilter('StringTrim')
->addValidator('int');
$subCategory = new Zend_Dojo_Form_Element_FilteringSelect('subCategoryId');
$subCategory
->addMultiOption('-1', '-- Select Category First --')
->setRequired(true)
->setAttribs(
array(
'disabled' => 'disabled',
'onchange' => 'JavaScript: subCategory_changed();',
'style' => 'width: 400px;'
)
)
->setLabel("Sub Category:")
->addValidator('int');
我尝试了几种不同的设置值的方法,但它似乎没有改变......结果对象看起来像这样:
result[0] "[{"name":"Test1","id":"1"}]"
我想要的只是"Test1"
的价值,我确信它很简单,但却看不到它!
答案 0 :(得分:1)
我认为你需要做的是改变你的电话
document.getElementById('subCategoryId')
到一个检索实际dijit小部件实例的调用:
var secondaryFilteringSelect = dijit.byId('subCategoryId');
document.getElementById
和dojo.byId
仅返回元素的物理dom节点,而不是实际的javascript小部件对象。您想要使用dijit.byId
。
然后,使用该小部件,您可以使用小部件的set
函数来设置其属性
secondaryFilteringSelect.set('disabled', false);
secondaryFilteringSelect.set('value', result[0].id);
请查看FilteringSelect API Docs了解详情。
此外,为了根据第一个菜单中的更改向FilteringSelect添加新选项,您可能希望查看FilteringSelect的继承方法addOption