1

我正在编写一个框架,允许您的模块在提供页面之前定义哪些 JS 文件将被添加到页面中。这个想法是一个模块可能会添加这样的东西:

require([ 'dojo/topic', 'dojo/_base/window', 'hotplate/hotDojoWidgets/AlertBar' ], function( topic, win, AlertBar
){
  globalAlertBar = new AlertBar( { background: '#FF4444' } );
  globalAlertBar.placeAt( document.body, 'first' );
  globalAlertBar.startup();

  topic.subscribe('globalAlert', function( message, displayFor ){
    displayFor = displayFor || 2500;
    globalAlertBar.set( 'message', message );
    globalAlertBar.show( displayFor );
  });
});

例如,这允许我允许应用程序周围的其他小部件发布globalAlert以显示 alertBar。马上:

  • 添加到要加载的 JS 列表中的任何 JS/Dojo 文件都以“require”开头。对我来说,这只是加载后会在某个时间点运行的异步代码。在框架中以这种方式加载的大部分代码都会等待主题发布,并会采取相应的行动
  • “应用程序”将只是这些模块之一,它将订阅发布容器对象的主题
  • 由 require() 加载的“正确的”Dojo 小部件显然会使用“定义”——这和往常一样,不用担心

问题:

1) 如果我ready()在页面中引用的其中一个 JS/Dojo 文件中运行,那会是页面级的 ready(),包括文档中加载的所有 .js 文件吗?还是仅针对当前文件加载的文件?

2)我意识到“正确”的做事方式是只运行一个 JS 文件require(),并从该文件加载其他所有文件(或者使用 data-dojo-main 更好)。但是,我正在尝试定义独立工作的模块(带有服务器和客户端代码)并将它们自己添加到页面中......那么,在应用程序页面中有一堆文件,然后拥有它们实际上是不好的做法require()正在运行 Dojo 代码?

谢谢!

默克。

PS如果你好奇,https://github.com/mercmobily/hotplate ...项目在这里发帖后开始!

4

1 回答 1

1

您可以根据需要对每个页面/文件/脚本有尽可能多的要求。它定义了每页只能使用一次,因为这就是页面/脚本位置和模块 ID 之间的关联。define并不严格用于小部件——它定义了一个模块,它可以是一个函数、构造函数(类)、一个单例对象,或者只是做一些工作而不返回任何东西。

require是异步的;因此,当所有依赖项完成加载时触发的回调方法:

require(modules, callback);

dojo/ready本质上是基于“块”的。在加载所有依赖项并且DOM 准备好之前,回调不会触发。它不是基于页面的,也不是全局的——如果第一个请求等待 DOM,则很有可能在第一个请求之前触发的页面上有第二个请求。

于 2013-01-02T01:20:53.920 回答