2013-06-25 3 views
4

Я поддерживаю и расширяю старый проект, который был до AMD. Я хочу добавить диаграмму в приложение. для этого я создал файл JS следующим образом:Как определить модуль и использовать его в додзё с AMD?

define(["dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], 
    function (Chart) { 

    function showDailyChart(data){ 
     //code to show the chart in a dialog 
    } 
    return customModules.singleChart; 
}); 

Я сохранил этот файл как /customModules/singleChart.js

В Мой основной HTML-страницы, я добавил его в пакеты следующим образом:

var dojoConfig = { parseOnLoad: true, 
     packages: [....,{"name":"customModules", 
      "location":location.pathname.replace(/\/[^/]+$/, "")+"/modules" } 
         ]}; 

Функция, из которой я хочу назвать ее, является до AMD. Поэтому я называю это следующим образом:

dojo.require("customModules.singleChart"); 
. 
. 
. 
customModules.singleChart.showDailyChart(data); 

Я могу видеть, что /customModules/singleChart.js загружается в Firebug консоли, а также Tab Net. Однако нет объекта customModules.singleChart. Как ни странно, ошибок нет. Я тестировал это в Firebug, а также в инструментах разработчика Google Chrome.

Каков правильный способ вызова модуля AMD с использованием dojo.require? Или есть лучший способ сделать то, что мне нужно?

ответ

6

Чтобы использовать виджет с предварительно AMD кодой, вам необходимо объявить модуль с помощью додзё/_Образов базового/определить, и есть первый аргумент вашего определения функции быть идентификатор модуля в точечной нотации, как это:

define(["dojo/_base/declare","dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (declare, Chart){ 
    return declare("customModules.singleChart", null, { 
     showDailyChart: function(data){ 
      //code to show the chart in a dialog 
     } 
    }); 
}); 

Второй аргумент функции объявляют класс или список классов, которые вы наследующие или нуль в этом случае.

Вы можете использовать этот виджет, создавая экземпляр с ключевым словом «новое».

var foo = new customModules.singleChart(); 
foo.showDailyChart(data); 
... 

Если вместо этого вы хотите статическую функцию, вы можете сделать это следующим образом:

define(["dojo/_base/declare","dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (declare, Chart){ 
    var widget = declare("customModules.singleChart", null, { 
    }); 

    widget.showDailyChart = function(data){ 
     //code to show the chart in a dialog 
    } 

    return widget; 
}); 

Вы можете использовать его как это:

customModules.singleChart.showDailyChart(data); 

Подробнее здесь: http://dojotoolkit.org/reference-guide/1.9/dojo/_base/declare.html#signature

+0

С помощью этого кода я могу получить объект 'customModules.singleChart', но на нем нет функции' showDailyChart'. –

+0

Вы должны создать экземпляр виджета. В этом случае функция не является статической, это функция экземпляра. См. Мой обновленный ответ. – Philippe

+0

Спасибо за xxplaining это так ясно! –

1

Я не уверен, но я думаю, вам нужно создать объект с showDailyChart. Нечто подобное может работать:

define(["dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (Chart) { 
    return { 
     showDailyChart: function(data){ 
      //code to show the chart in a dialog 
     } 
    } 
}); 

Обычно вы должны быть в состоянии использовать свой модуль в настоящее время путем доступа:

require(["myPackage/myModule"], function(myModule) { 
    myModule.showDailyChart(myData); 
}); 

Или с унаследованным кодом (напомним, что это будет исчезать в 2.0).

dojo.require("myPackage.myModule"); 
myPackage.myModule.showDailyChart(myData); 
1

Модуль dojo/_base/loader является тем, который несет ответственность за обработку dojo.require звонки в Dojo 1.7+. Когда вы загружаете модуль AMD с использованием устаревшего метода dojo.require, если правило config-publishRequireResult является правдивым (оно по умолчанию), то объект, возвращаемый модулем AMD, будет автоматически определен с использованием имени объекта, указанного в вызове dojo.require, как поскольку объект уже не существует.Из 1,9 источника Dojo, loader.js:669-672:

var result = doRequire(moduleName, omitModuleCheck); 
if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){ 
    lang.setObject(moduleName, result); 
} 

Если это не работает, потому что один из этих условий не является истинным, вы можете вручную установить объект, используя dojo/_base/lang.setObject себя. Используя версию с тремя аргументами dojo/_base/declare, как предложил Филипп, только dojo/_base/declare звонит setObject сам.