web-dev-qa-db-ja.com

未定義のプロパティ 'indexOf'を読み取れません

私はjqueryのいくつかの日付ピッカーに異なるオプションを設定しようとしています。私のコードは次のようになります:

{foreach $cart->getItems() as $item}
    {if $item->action->prereservation}
        var disableDates = new Array();
        {if $item->action->hasVariants()}
        disableDates[{!$item->id}] = {$disabledDates[$item->action->id][$item->idVariant]};
        {else}
        disableDates[{!$item->id}] = {$disabledDates[$item->action->id]};
        {/if}

        if (disableDates[{!$item->id}].length !== 0) {
            $(".datepicker_"+'{$item->id}').datepicker({
                maxDate: new Date('{!$item->action->voucherTo|date: Y-m-d}'),
                beforeShowDay: function(date){
                    var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
                    console.log(disableDates[{!$item->id}]) // result is undefined (but not for last iteration)
                    return [ disableDates[{!$item->id}].indexOf(string) == -1 ]
                }
            })
        } else {
            $(".datepicker_"+'{$item->id}').datepicker({
                maxDate: new Date('{!$item->action->voucherTo|date: Y-m-d}'),
            })
        }
    {/if}
{/foreach}

しかし、foreachに複数の項目がある場合、jsコンソールでエラーが表示されます最初の反復で未定義のプロパティ 'indexOf'を読み取れません。最後の反復のみが適切です。誰かが私を助けてくれますか?

私のコードでは、テンプレートシステムLatteとjqueryを組み合わせています。

これはブラウザでの私の最後のコードです:

var disableDates = new Array();
        disableDates[777955] = ["2014-07-25","2014-07-26","2014-07-27","2014-07-28","2014-07-29","2014-07-30","2014-07-31"];

        if (disableDates[777955].length !== 0) {
            $(".datepicker_"+'777955').datepicker({
                maxDate: new Date('2014-07-31'),
                beforeShowDay: function(date){
                    var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
                    return [ disableDates[777955].indexOf(string) == -1 ]
                }
            })
        } else {
            $(".datepicker_"+'777955').datepicker({
                maxDate: new Date('2014-07-31'),
            })
        }

アドバイスをありがとう

6
Lukeluha

ループでそれを行っている場合は、配列をオーバーライドし続けます!

var disableDates = new Array();
disableDates[123] = 123;
console.log(disableDates[123]);  //123

var disableDates = new Array();
disableDates[456] = 456;
console.log(disableDates[123]);  //undefined

配列宣言をループの外に移動するか、新しい配列を作成する前に存在するかどうかを確認してください。

3
epascarello

最初に文字列をテストしてから、indexOfを使用できます。次に例を示します。

var mydate;
for(i=0; i<mydate.length; i++) {
    if( mydate[i] ) {
        if(mydate[i].indexOf("some") {
              alert("OK");
        }
     }
}
0
user5287393