dojo filteringselect with ajax call - 如何使用返回值填充选择框

时间:2011-08-11 12:50:56

标签: javascript ajax dojo

我想我已经完成了困难的事情。我有一个带有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"的价值,我确信它很简单,但却看不到它!

1 个答案:

答案 0 :(得分:1)

我认为你需要做的是改变你的电话

document.getElementById('subCategoryId')

到一个检索实际dijit小部件实例的调用:

var secondaryFilteringSelect = dijit.byId('subCategoryId');

document.getElementByIddojo.byId仅返回元素的物理dom节点,而不是实际的javascript小部件对象。您想要使用dijit.byId

然后,使用该小部件,您可以使用小部件的set函数来设置其属性

secondaryFilteringSelect.set('disabled', false);
secondaryFilteringSelect.set('value', result[0].id);

请查看FilteringSelect API Docs了解详情。

此外,为了根据第一个菜单中的更改向FilteringSelect添加新选项,您可能希望查看FilteringSelect的继承方法addOption