2017-05-22 13 views
1

app.jsutils.js 두 개의 파일이 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.utils'를 정의? 왜 새로운 객체로'app'을 덮어 씁니까? –

+0

죄송 합니다만,이 파일들이 빌드 과정에서 함께 연결되어 있다는 것을 잊어 버렸습니다. 그리고 나는 JS를 쓰는 데별로 싫증이났습니다. – forcequitIO

+0

@ShatteredRib, 내 대답을 볼 수 있습니다. –

답변

1

작동합니다 :

//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 발생합니다.) Dev 도구에서 _app.utils_ 입력하면 정의되지 않은 반환합니다 . – forcequitIO

+0

사실, app.js는 'init'과'mapYear'만을 보여줍니다. –

+0

동의하지만, 나는 또한 유틸리티를 폭로하고 싶습니다. 그리고 나는 당신의 제안 된 대답으로 그런 일이 일어나게하는 방법을 모르겠습니다. – forcequitIO

1

app.js에서, 당신은 utils.js의 contetns 이전 getMapYear를 호출하는 것은 평가되었고, app.utils 정의되었습니다 :

const mapYear = getMapYear(); 

따라서, app.utils app.js에서 내 반환 문은 다음과 같습니다 정의되어 있지 않으므로 호출 할 수 없습니다.

// 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.mapYear 당신이 app.init()라고 후에 만 ​​존재한다. 이 순서에서

+0

나는 이것이 문제 일 수도 있다고 생각했다. 나는 내 질문에 대한 코드를 단순화했다. 하지만 _utils.js_보다 먼저로드되는 _base.js_ 파일도 있습니다. _base.js_는로드 스피너를 호출하는 utils 메소드를 사용합니다. 그 방법은 아무런 문제없이 실행되기 때문에 내가 당혹 스러웠습니다. – forcequitIO

+0

@ShatteredRib'base.js'에서 유틸리티 메소드를 호출하면, 제 대답과 같을 것입니다 :'base.js'가 먼저로드 된 다음'util.js'가로드되고 얼마 후 유틸리티 메소드가 호출됩니다. – PeterMader