0

我正在使用requireJS并且需要根据条件改变请求的文件数量a == true

目前我正在这样做,这不起作用:

// ok
var  baseRequestWidgets = $('html').attr('init') != true 
    ?  [ "text!../tmp/page/tmp_page_header_generic.html"
        ,"text!../tmp/page/tmp_page_header_specific.html"       
        ,"text!../tmp/widgets/tmp_widget_header.html"
        ,"text!../tmp/widgets/tmp_widget_navbar.html"
        ,"text!../tmp/page/tmp_page_footer.html"
        ]
    :  [ "text!../tmp/widgets/tmp_widget_header.html"
        ,"text!../tmp/widgets/tmp_widget_navbar.html"
        ]
// not ok
    , baseRequestObjects = $('html').attr('init') != true 
    ?  page_header_generic, page_header_specfic, page_widget_header, page_widget_navbar, page_footer 
    : page_widget_header, page_widget_navbar 


    require( baseRequestWidgets, function( baseRequestObjects
                                                /*
                                                  page_header_generic
                                                , page_header_specfic
                                                , page_widget_header
                                                , page_widget_navbar
                                                , page_footer 
                                                */
                                                ){ ... }

问题是我无法将对象传递给使用baseRequestObjects. 文件被正确请求,但baseRequestObjects不起作用。

问题:
任何想法我做错了什么?谢谢!

编辑
我得到的错误是page_header_generic is not defined,所以我假设我的 page_header_generic 声明是在请求基础文件之前完成的???

编辑
更接近... RequireJSbaseRequestObjects用于存储第一个请求的文件,而实际上它是可变数量的请求文件的占位符。

所以问题应该是: 当包含x个对象名称的占位符被误解为单独的占位符名称本身时,如何将动态数量的对象名称传递给requireJS?

编辑:
所以这行得通,不确定我是否喜欢它,因为我什么都没通过......

var baseRequestWidgets = function(trigger){
    var passBack;
    if ( trigger == "true" ){
        passBack = [     "text!../tmp/widgets/tmp_widget_header.html"
                        ,"text!../tmp/widgets/tmp_widget_navbar.html"
                    ];
                    } else {
        passBack = [     "text!../tmp/widgets/tmp_widget_header.html" 
                        ,"text!../tmp/widgets/tmp_widget_navbar.html"
                        ,"text!../tmp/page/tmp_page_header_generic.html"
                        ,"text!../tmp/page/tmp_page_header_specific.html"       
                        ,"text!../tmp/page/tmp_page_footer.html"
                    ];
            }
        return passBack;
        }   
    , getBaseRequestObjects = function( temps) {
        var objArr = [];
        for ( var i = 0; i < temps.length; i++){
            var thisString = temps[i],
            addToArray = temps[i].match(/tmp_(.*?)\.html/);
            objArr.push( addToArray[1] )
            }
        return objArr;
        }
    , baseRequestObjects

我需要把它放在一个函数中,因为这两个变量都必须是动态的。

然后我像这样调用require:

// inside my event call
var ...
    widgetsForThisRequest = baseRequestWidgets(trigger),
    baseRequestObjects = getBaseRequestObjects( widgetsForThisRequest );

require( widgetsForThisRequest,
    function( /* dynamic */ ) {
        // this will be dnyamic strings
        console.log( widgetsForThisRequest );
        // this will be dynamic objects
        console.log( baseRequestObjects );

        // loop using arguments - not sure if I like this
        for ( i = 0; i < baseRequestObjects.length; i++){
            widget = arguments[i];
            tempName = baseRequestObjects[i];
            ...

所以我没有传递任何对象,并且必须在我的循环中使用arguments. 似乎工作,但不确定这是要走的路。无论如何,有超过 2 或 5 个字符串,因此必须有超过 2 或 5 个携带相应字符串的对象。现在我很好,但如果有人知道更好的方法,谢谢分享!

4

2 回答 2

2

您标记为“不好”的代码并没有按照您的想法执行;你不能创建这样的变量。

我只是重新排序您的包含,以便您始终请求的两个文件首先出现,然后检查您的定义中是否存在其他模块。

var  baseRequestWidgets = $('html').attr('init') != true 
    ?  [ "text!../tmp/widgets/tmp_widget_header.html"
        ,"text!../tmp/widgets/tmp_widget_navbar.html"
        ,"text!../tmp/page/tmp_page_header_generic.html"
        ,"text!../tmp/page/tmp_page_header_specific.html"       
        ,"text!../tmp/page/tmp_page_footer.html"
        ]
    :  [ "text!../tmp/widgets/tmp_widget_header.html"
        ,"text!../tmp/widgets/tmp_widget_navbar.html"
        ]

    require( baseRequestWidgets, function(    page_widget_header
                                            , page_widget_navbar
                                            , page_header_generic
                                            , page_header_specfic
                                            , page_footer 
                                            ){

         // page_widget_header and page_widget_navbar are always loaded

         // page_header_generic, page_header_specfic and page_footer
         // are undefined if init === true
    }
于 2012-10-12T16:48:43.517 回答
1

您可以将所有参数存储在一个数组(可变大小)中并在该函数上使用该.apply方法

于 2012-10-12T13:09:19.127 回答