javascript - 如何改变js中的函数参数并且所有参数都是对象?

标签 javascript function parameters requirejs

我正在使用 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 声明是在请求底层文件之前完成的???

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

所以问题应该是: 当包含 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];
            ...

因此,我没有传递任何对象,并且必须使用参数在循环内手动设置小部件。似乎可行,但不确定这是正确的方法。无论如何,有超过 2 或 5 个字符串,因此必须有超过 2 或 5 个物体携带相应的字符串。现在我还好,但如果有人知道更好的方法,感谢分享!

最佳答案

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

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

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
    }

关于javascript - 如何改变js中的函数参数并且所有参数都是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12859075/

相关文章:

javascript - 这个非常简单的 switch 语句有什么问题?

javascript - 从数组中的每个字符串值中删除公共(public)单词

javascript - jquery ajax unhide div 如果变量等于

php - 将关联数组传递给 PHP 中的函数

linux - 需要将 getopts 与一个参数或另一个参数一起使用

Python代码对象、函数和默认参数

javascript - 添加 X 轴标题导致 Uncaught RangeError : minimumFractionDigits value is out of range in Chart. js

c++ - 如何在参数中传递函数,然后从对象调用该函数

javascript - 用户在输入字段中输入前 4 位数字后运行函数

python - 如何将一个函数的输出作为输入传递给另一个函数?