Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得<;脚本>;定义requirejs主入口的元素?_Requirejs - Fatal编程技术网

如何获得<;脚本>;定义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 {

我想先为requirejs传递一些参数,如下所示:

<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
,都无关紧要:它的工厂函数最多执行一次。我仍在评估你的建议。它看起来不错,但我还没有完全理解。我理解后会接受答案.