2017-05-22 3 views
1

私はのapp.jsのutils.jsという2つのファイルをGulpを介してビルド時に一緒に連結しています。モジュールのパターンを表示、未定義のプロパティ

戻り値の中にapp.mapYear値を設定しようとすると、「未定義のgetUrlParamプロパティを読み取れません」というエラーが表示されます。

の設定機能の中にapp.mapYearが設定されているようです。私はなぜ私がapp.mapYear私のリターンステートメントに設定することができないのだろうかと思っています。

私はここで何かが欠けていますか?より良い方法がありますか?私は私のリターンでそれを行うことができれば、私のコード全体にわたってオブジェクトのプロパティを散発的に設定するのを避けることを望んでいます。

// app.js 
//***************** 
'use strict'; 

var app = app || {}; 
app = (function() { 

    const getMapYear =() => { 
     return app.utils.getUrlParam('year'); 
    }; 

    const mapYear = getMapYear(); 

    const init =() => { 
     //init offcanvas menu 
     $(document).foundation(); 

     // app.mapYear = mapYear(); 
    }; 

    return { 
     init, 
     mapYear 
    }; 

})(); 

$(function() { 
    app.init(); 
}); 


utils.js 
//***************** 

var app = app || {}; 

app.utils = (function() { 

    const getUrlParam =() => { 
     console.log(document.location.search); 
     return document.location.search; 
    } 

    return { 
     getUrlParam 
    }; 

})(); 

お時間をありがとうございました!

編集:同じ問題を抱えている人は、ここで回答があれば解決した方法があります。

コンパイルすると、utils.jsが先に続き、app.jsが続きます。

return { 
    init, 
    utils: app.utils, 
    mapYear: getMapYear() 
}; 
+0

を?なぜあなたは 'app'に新しいオブジェクトを上書きしていますか? –

+0

私の謝罪、私はこれらのファイルが私のビルドプロセス中に一緒に連結されていることを忘れて、私はひどくJSを書く経験はありません。 – forcequitIO

+0

@ ShatteredRib、あなたは私の答えで見ることができます。 –

答えて

1

は動作します:あなたは `app.utils`を定義している

//utils.js 
 
//***************** 
 

 
var app = app || {}; 
 

 
app.utils = (function() { 
 

 
    const getUrlParam =() => { 
 
    console.log(document.location.search); 
 
    return document.location.search; 
 
    } 
 

 
    return { 
 
    getUrlParam 
 
    }; 
 

 
})(); 
 

 

 
// app.js 
 
//***************** 
 
'use strict'; 
 
//   |-- app contains the definition of (utils.js). 
 
var app = app || {}; 
 
app = (function() { 
 

 
    const getMapYear =() => { 
 
    return app.utils.getUrlParam('year'); // You can use «app.utils». 
 
    }; 
 

 
    const mapYear = getMapYear(); 
 

 
    const init =() => { 
 
    //init offcanvas menu 
 
    // $(document).foundation(); 
 

 
    // app.mapYear = mapYear(); 
 
    }; 
 

 
    return { 
 
    init, 
 
    mapYear, 
 
    app 
 
    }; 
 

 
})(); 
 

 
$(function() { 
 
    app.init(); 
 
    console.log(app); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

enter image description here

+0

こんにちはダニー、私は質問を投稿する前にこれを試みたが、app.utilsがウィンドウに公開されていないことに気付いた(ただし、utilsのconsole.logは起動する)。_app.utils_をタイプするとDev Toolsではundefined 。 – forcequitIO

+0

実際、app.jsは 'init'と' mapYear'だけを公開しています。 –

+0

合意しましたが、私もutilsを公開したいと思います。あなたの提案された答えでそれをどうやって実現するかわかりません。 – forcequitIO

1

app.jsでは、あなたがutils.jsのcontetns前getMapYearを呼んでいることは評価されているとapp.utilsが定義されています:

const mapYear = getMapYear(); 

したがって、app.utils app.jsマイreturn文は次のようになります定義されておらず、そのメソッドを呼び出すことはできません。

// in the app.js closure 
const getMapYear =() => { 
    return app.utils.getUrlParam('year'); 
}; 

const init =() => { 
    //init offcanvas menu 
    $(document).foundation(); 

    app.mapYear = getMapYear(); // call getMapYear later  
}; 

はそれのメソッドを呼び出すときapp.utilsオブジェクトがすでに存在することを確認してください:utils.jsの読み込みが完了したときは、getMapYearを呼び出す必要があります。

注:app.init()を呼び出すと、この方法ではapp.mapYearが存在します。このためには

+0

これも問題だと思いました。私は自分の質問のコードを簡略化しました。しかし、_utils.js_の前にロードされる_base.js_ファイルもあります。 _base.js_は読み込みスピナーを呼び出して表示するutilsメソッドを使用します。その方法は問題なく実行されるため、私は困惑していました。 – forcequitIO

+0

@ShatteredRib 'base.js'でユーティリティメソッドを呼び出すと、答えが' base.js'が最初にロードされ、その後 'util。js'がロードされた後、しばらくしてユーティリティメソッドを呼び出します。 – PeterMader

関連する問題