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の私の宣言が要求されている基礎となるファイルの前に行われると思います???

編集
より近い... 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];
            ...

したがって、オブジェクトを渡さず、ループ内でを使用してウィジェットを手動で設定する必要がありますarguments。動作しているように見えますが、これが正しい方法かどうかはわかりません。とにかく、2つまたは5つ以上の文字列があるので、それぞれの文字列を運ぶ2つまたは5つ以上のオブジェクトが必要になります。今のところ私は大丈夫ですが、誰かがより良いアプローチを知っているなら、共有してくれてありがとう!

4

2 に答える 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 に答える