использование виджетов dijit.byId w dojox.mobile

Я динамически создаю серию виджетов dojox.mobile.ListItem под статически определенным виджетом dojox.mobile.RoundRectList с помощью этой функции...

function displayOpps(items) {

// Create the list container that will hold application names
var rrlOppsContainer = dijit.byId("rrlOpps");   
// Add a new item to the list container for each element in the server respond
for (var i in items){

    // Create and populate the list container with applications' names
    var name = items[i].CustName + " - " + items[i].OppNbr;
    var liOpps = new dojox.mobile.ListItem({
        label: name,
        moveTo: "sv3OppDetail"  
    });

    // Add the newly created item to the list container
    rrlOppsContainer.addChild(liOpps);
}

}

Когда я запускаю этот код во время onLoad() в моем html-файле, я получаю следующую ошибку, используя инструменты разработчика Chrome...

Uncaught TypeError: объект # не имеет метода 'byId'

Я прочитал множество статей по этой теме, и кажется, что у многих людей есть эта проблема, но все, что я нашел, связано с какой-либо другой технологией (например, Spring MVC и т. д.), и я пытаюсь использовать ее. приложение на базе dojox.mobile. Тем не менее, я попытался имитировать некоторые решения, предложенные другими, включив это в свой html-файл, и это все еще не работает...

<script type="text/javascript"
data-dojo-config="isDebug: true, async: true, parseOnLoad: true"
src="dojo/dojo.js">
dojo.require("dojox.mobile.RoundRectList")
</script>

Что я делаю неправильно?

Заранее благодарим вас за ваше время и опыт.


person trbo    schedule 08.07.2012    source источник


Ответы (1)


Если вы используете Dojo 1.7+, возможно, вы просто забыли потребовать модуль "dijit/registry". Здесь определена функция byId. Когда вы используете виджеты рабочего стола, они загружаются косвенно другими базовыми модулями, но с dojox/mobile вы должны загружать их явно (поскольку dojox/mobile по умолчанию загружает только очень минимальный набор модулей, чтобы минимизировать объем кода).

В зависимости от того, как вы написали свое приложение, сделайте следующее:

dojo.require("dijit.registry");  // legacy (pre-1.7) loader syntax
...
var rrlOppsContainer = dijit.byId("rrlOpps");
...

или это:

require(["dijit/registry", ...], function(registry, ...){ // 1.7+ AMD loader syntax
    ...
    var rrlOppsContainer = registry.byId("rrlOpps");
    ...
});


Также обратите внимание, что ваш второй пример кода пытается использовать асинхронную загрузку (async: true), в то время как он использует устаревший синтаксис загрузчика. Это не сработает, чтобы получить асинхронную загрузку, вы должны использовать синтаксис AMD.

person edurocher    schedule 09.07.2012
comment
хммм... Я изменил параметр async на false, а затем добавил устаревший синтаксис dojo.require(dijit.registry); как было предложено, и ошибка все еще возникает. Как я уже говорил, я видел много работающих примеров этого, поэтому я полагаю, что у меня есть какая-то другая ошибка, которая препятствует загрузке пакета dijit. Любые другие мысли? - person trbo; 09.07.2012
comment
Я нашел свою проблему ... Я смешал устаревший синтаксис и синтаксис AMD. Спасибо за ваше время и опыт. - person trbo; 11.07.2012