如何获得<;脚本>;定义requirejs主入口的元素?
我想先为requirejs传递一些参数,如下所示:如何获得<;脚本>;定义requirejs主入口的元素?,requirejs,Requirejs,我想先为requirejs传递一些参数,如下所示: <script src=".../require.min.js" data-main="..../config.js" data-modules="sticker datepicker"> </script> define(function () { function init() { // Initialize here. } return {
<script src=".../require.min.js"
data-main="..../config.js"
data-modules="sticker datepicker">
</script>
define(function () {
function init() {
// Initialize here.
}
return {
init: init,
}
});
define(function () {
// Initialize here
});
define(["datepicker"], function (datepicker) {
// There is no need to call init.
});
问题是如何获取模块\u参数
我现在可以使用jquery,比如$('script[datamain]')
。但是由于显然requirejs正在扫描数据主
,它是否公开了一个api来访问相同的
标记
背景
我有一个layout.html:
和一个page1.html来扩展它:{placeholder}标签日期选择器{/placeholder}
和一个page2.html来扩展它:{placeholder}另一个2{/placeholder}
这样每个页面都可以加载自己的模块。在您的RequireJS配置中,您可以添加一个
config
属性,并将运行初始化代码的模块作为目标:
require.config({
...
config: {
"app/config": {
initModules: ["sticker", "datepicker"]
}
}
...
});
现在从您的app/config
模块:
define(["underscore", "module"], function(_, module) {
var modules = module.config().initModules;
_.each(modules, function (m) {
// do your normal code here
});
});
如果您不介意重新排列代码,此解决方案可以处理动态定义的
initModules
。我通常做的是将RequireJS配置与主模块分开。然后我有机会从内联脚本自定义配置(通常用于语言首选项):
不像
require.config({…})代码>我在评论中建议将模块初始化作为模块实例化的一部分。hbrlovehaku(最初的询问者)询问更多细节。评论太过拘束,所以我在这里回答
原始问题中的设计表明,类似“datepicker”的模块定义如下:
<script src=".../require.min.js"
data-main="..../config.js"
data-modules="sticker datepicker">
</script>
define(function () {
function init() {
// Initialize here.
}
return {
init: init,
}
});
define(function () {
// Initialize here
});
define(["datepicker"], function (datepicker) {
// There is no need to call init.
});
因此,使用上述模块的人必须:
define(["datepicker"], function (datepicker) {
datepicker.init();
});
这是因为模块实例化和模块初始化是解耦的。然而,他们不必如此。模块的定义如下:
<script src=".../require.min.js"
data-main="..../config.js"
data-modules="sticker datepicker">
</script>
define(function () {
function init() {
// Initialize here.
}
return {
init: init,
}
});
define(function () {
// Initialize here
});
define(["datepicker"], function (datepicker) {
// There is no need to call init.
});
通过上述设计,只要另一个模块需要,模块就会被初始化。请注意,传递给define
的函数只有在模块需要“日期选择器”时才会执行。因此,使用“datepicker”的模块可以如下所示:
<script src=".../require.min.js"
data-main="..../config.js"
data-modules="sticker datepicker">
</script>
define(function () {
function init() {
// Initialize here.
}
return {
init: init,
}
});
define(function () {
// Initialize here
});
define(["datepicker"], function (datepicker) {
// There is no need to call init.
});
然后,页面可以包含以下内容:
<script src="[...]/require.min.js" data-main="[...]/config.js"></script>
<script>
(function () {
var mods = "{placeholder}".split(" ");
// I don' know whether the anonymous function is necessary in the next line.
require(mods, function () {});
)();
</script>
(功能(){
var mods=“{placeholder}”.split(“”);
//我不知道下一行是否需要匿名函数。
require(mods,function(){});
)();
实际上,即使需要初始化函数,上面的这个小片段也可以修改使用。如下所示:
<script src="[...]/require.min.js" data-main="[...]/config.js"></script>
<script>
(function () {
var mods = "{placeholder}".split(" ");
require(mods, function () {
Array.prototype.forEach.call(arguments, function (mod) {
mod.init();
});
});
)();
</script>
(功能(){
var mods=“{placeholder}”.split(“”);
需要(mods,功能(){
Array.prototype.forEach.call(参数、函数(mod)){
mod.init();
});
});
)();
{placeholder}
只需要用实际的模块名替换,就像在数据模块=“{placeholder}”中一样
据我所知,没有这样的API。但这是可行的另一种方式,即您的require配置中的config
属性。您对这样的解决方案感兴趣吗?是的,如果jquery免费且elegant@hbrlovehaku为什么要将模块实例化与模块初始化分离?日期选择器的初始化是否如此重要我们还是特别的,它需要与模块的实例化分离?除此之外,我同意Nikos。@Louis DominiqueDubeau,我不明白你的意思。也许我太拘泥于我自己的设计。我已经添加了我为什么这样做的背景。请帮助检查它是否合理。我同意你的init代码>并不总是必要的。但由于我不确定它何时是单例,何时不是,所以我选择init
它们。这肯定需要重新思考。Array.prototype
看起来不错。谢谢你。但我现在关心的问题是如何“定义”它们在html模板中。@hbrlovehaku RequireJS模块是单例的。页面的代码对任何给定模块调用多少次require
,都无关紧要:它的工厂函数最多执行一次。我仍在评估你的建议。它看起来不错,但我还没有完全理解。我理解后会接受答案.