Zend Dojo comboBox не находит dojo.data - PullRequest
0 голосов
/ 27 октября 2009

Я пытаюсь заставить работать comboBox в Zend со следующим кодом:

$url = '/db/autocomplete/table/suburbs';
$element = new Zend_Dojo_Form_Element_ComboBox('suburb1');
$element->setStoreId('suburbsStore');
$element->setStoreType('dojo.data.ItemFileReadStore');
$element->setStoreParams(array('url' => $url));
$element->setDijitParam('searchAttr', 'name');

и выводится этот javascript (я его немного переформатировал):

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js"></script>

<script type="text/javascript">//<![CDATA[
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.form.ComboBox");
dojo.require("dojo.parser");
dojo.addOnLoad(function() {
    dojo.forEach(zendDijits, function(info) {
        var n = dojo.byId(info.id);
        if (null != n) {
            dojo.attr(n, dojo.mixin({ id: info.id }, info.params));
        }
    });
    dojo.parser.parse();
});
var suburbsStore = new dojo.data.ItemFileReadStore({"url":"\/db\/autocomplete\/table\/suburbs"});
var zendDijits = [
    {"id":"suburb1","params":{
        "store":"suburbsStore",
        "searchAttr":"name",
        "dojoType":"dijit.form.ComboBox"}
    },
    {"id":"suburb2","params":{
        "store":"suburbsStore",
        "searchAttr":"name",
        "dojoType":"dijit.form.ComboBox"}
    }
];
//]]></script>

и этот HTML-код (с удалением посторонних материалов):

<input options="" id="suburb1" name="suburb1" value="" type="text" />
<input options="" id="suburb2" name="suburb2" value="" type="text" />
<input type="submit" />

и ошибка, которую я получаю: dojo.data не определена в строке var suburbsStore = new dojo.data.ItemFileReadStore(...). Конечно, этот вызов после dojo.require("dojo.data.ItemFileReadStore"); и так должно быть в порядке ?! Но, очевидно, я что-то упускаю.

Спасибо!

1 Ответ

2 голосов
/ 27 октября 2009

Когда вы используете междоменное dojo (в вашем случае Google CDN), dojo.require работает асинхронно, поэтому я думаю, что проблема в том, что вы пытаетесь создать экземпляр ItemFileReadStore до того, как он действительно станет доступным. Вы должны переместить свой код (var suburbsStore = new dojo.data.ItemFileReadStore ...) в обработчик dojo.addOnLoad, поскольку он гарантированно будет запущен, когда все модули будут доступны. Вы можете прочитать о различиях между обычными и xdomain загрузчиками здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...