【发布时间】:2012-08-14 16:44:13
【问题描述】:
我在使用 Dojo 的加载程序时遇到了真正的问题。我发现在这里粘贴代码真的很困难,因为这是一个涉及整个应用程序的问题。
我创建了一个名为 LoginForm 的小部件,它的开头如下:
define([
"dojo/_base/declare",
"app/globals",
"app/stores",
"dijit/form/Form",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dijit/layout/TabContainer",
"dijit/layout/StackContainer",
"dijit/layout/ContentPane",
"dijit/layout/BorderContainer",
"dijit/form/Button",
"app/widgets/ValidationPassword",
"app/widgets/ValidationEmail",
"app/widgets/AlertBar",
"app/widgets/StackFading",
"app/widgets/TabFading",
"dojo/_base/lang",
"app/widgets/BusyButton",
"dojo/_base/json",
"dojo/_base/fx",
"dojo/text!app/widgets/templates/LoginForm.html",
], function(
declare,
...
, json
, baseFx
, templateString
){
// Create the "login" pane, based on a normal ContentPane
return declare('app.LoginForm', [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
widgetsInTemplate: true,
templateString: templateString,
这是一个使用模板的简单小部件,在模板中还有一些子小部件,如此处所述。
现在...我正在尝试在 Ajax 回调中创建一个 Loginform 类型的对象。 但是,加载程序让我失望了。
应用程序的主屏幕如下所示:
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"app/widgets/Dashboard",
"app/globals",
"dijit/layout/BorderContainer",
"dijit/layout/StackContainer",
"dijit/layout/TabContainer",
"dijit/layout/ContentPane",
"app/widgets/SearchPage",
], function(
declare
, _WidgetBase
...
, SearchPage
){
// Create the "login" pane, based on a normal ContentPane
return declare('AppMainScreen', [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
...
第三个小部件,仪表板,只有一个按钮:
define([
"dojo/_base/declare",
"app/globals",
"app/defaultSubmit",
"app/stores",
"dijit/form/Form",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"app/widgets/AlertBar",
"app/widgets/BusyButton",
"dojo/_base/json",
"dojo/domReady!",
], function(
declare
, g
, ds
, stores
, Form
, _WidgetBase
, _TemplatedMixin
, _WidgetsInTemplateMixin
, AlertBar
, BusyButton
, json
){
// Create the "login" pane, based on a normal ContentPane
return declare('app.Dashboard', [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
widgetsInTemplate: true,
templateString: '' +
'<div>' +
' <div data-dojo-type="app.AlertBar" data-dojo-attach-point="alertBar"></div>' +
' <form data-dojo-type="dijit.form.Form" data-dojo-attach-point="form" method="POST"> ' +
' <input type="submit" data-dojo-attach-point="button" data-dojo-type="app.BusyButton" label="Create!" />' +
' </form>' +
'</div>',
该表单的 onSubmit 然后链接到 "app/defaultSubmit", 中的一个函数,内容如下:
define([
'app/globals',
'dijit/registry',
'dojo/query',
'dojo/aspect',
'dojo/_base/lang',
'dojo/_base/json',
'dijit/Tooltip',
'dijit/Dialog',
'app/widgets/LoginForm',
],function(
g
, registry
, query
, aspect
, lang
, json
, Tooltip
, Dialog
, LoginForm
){
问题是 LoginForm 不起作用,因为 LoginForm 的构造函数不起作用:它说它不能实例化依赖类之一。
现在,如果我将其添加到应用程序的 mainScreen 的 postCreate:
var loginForm = new LoginForm({});
然后,在回调中,LoginForm() 神奇地工作 (!)。
我知道我没有发布所有代码,但是就 AMD 中如何处理依赖项而言,我需要了解什么魔法吗?如何确保在回调中解析模块...?
再见,
佣兵团
【问题讨论】:
-
LoginForm是否在任何地方的模板中以声明方式使用? (必须在解析此模板之前加载。) -
它在另一个页面(登录页面!)上以声明方式使用。当会话到期并且用户需要再次登录时,我计划在回调中以编程方式使用它(我在对话框中创建它)。 “必须在解析此模板之前加载它”是什么意思?我很迷茫......加载机制实际上是如何工作的?如果将声明函数的回调中的变量设置为模块的依赖项...?!?
标签: javascript dojo js-amd