일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 드립 커피
- fso
- vbscript
- 아라비카
- 함수
- 수마트라 원두
- Android
- NGUI
- robusta
- 자마린
- 원두
- xamarin.forms
- asp
- xamarin.android
- 여행
- liberica
- 프렌치프레스
- 태그를 입력해 주세요.
- ServerVariables
- 커피
- Classic ASP
- 제주도
- 미디엄 로스팅
- KnockoutJS
- xamarin
- 템플릿
- KO
- 라이트 로스팅
- shared
- Unity
- Today
- Total
개발人
REQUIREJS(AMD) 이용시 외부에서 접근 방법 본문
KnockoutJS(일명 KO) 와 RequireJS(AMD) 를 사용해서 개발을 하게 되면 Javascript 관리 및 관심사 분리에 있어서 많은 이점을 얻을 수 있습니다. 하지만, 기존에 개발하던 방식과는 많은 차이가 있기 때문에 불편한 점도 있을 수 있을거 같은데요. 물론, 해결방법을 몰랐을때에 한해서 입니다. 그 중에서 iframe 과 popup 에서 부모나 오프너로 접근시 접근하기가 쉽지 않은데요. 해결하는 방법을 적어 봤습니다.
우선 Require.js (v2.2.0)
, knockout.js (v3.4.0)
파일을 /Js
폴더 하위에 위치시킵니다. 그리고 나서 설정을 선언할 파일을 동일한 위치에 생성하고 아래와 같이 작성합니다.
main.js
require.config({
baseUrl: '/js',
paths: {
'ko3.4.0': 'knockout'
},
shim: {
'ko3.4.0': {
exports: 'ko'
}
},
waitSeconds: 15
});
팝업을 띄울 메인 Html 파일을 만듭니다.
index.html
<!DOCTYPE html>
<html lang=ko>
<head>
<title>KO With RequireJS>팝업에서 접근하기</title>
</head>
<body>
<h1>RequireJS Popup Test</h1>
<button data-bind="click: popup">Popup</button>
<script src="/js/require.js"></script>
<script src="/js/main.js"></script>
<script>
"use strict";
require([
'ko3.4.0'
],
function(ko) {
var ViewModel = function() {
var self = this;
self.popup = function() {
window.open('Popup.html', 'pop', 'width=300,height=200');
};
};
ko.applyBindings(new ViewModel);
},
function(err) {
alert(err);
});
</script>
</body>
</html>
팝업창도 만듭니다. 부모창에 접근하는 OpenerCall
메서드도 추가 합니다. 부모창에 불리워질 메서드는AccessCall
이란 메서드가 있다고 가정하고 호출하는 코드를 작성합니다.
Popup.html
<!DOCTYPE html>
<html lang=ko>
<head>
<title>KO With RequireJS>팝업에서 접근하기</title>
</head>
<body>
<h1>RequireJS Opener Test</h1>
<button>Opner Access</button>
<script src="/js/require.js"></script>
<script src="/js/main.js"></script>
<script>
"use strict";
require([
'ko3.4.0'
],
function(ko) {
var ViewModel = function() {
var self = this;
self.OpenerCall = function() {
opener.AccessCall();
};
};
ko.applyBindings(new ViewModel);
},
function(err) {
alert(err);
});
</script>
</body>
</html>
그리고 팝업에서 불리어질 AccessCall
메서드를 index.html
에 추가합니다.
index.html 에
AccessCall
,self.AccessCall
메서드 추가
... 생략
require([
...
],
function(ko) {
...
self.AccessCall = function() {
alert('OK~~!');
}
}
...
);
function AccessCall() {
self.AccessCall();
}
팝업을 띄워 부모창에 접근이 되는지 확인을 해보면… 안타깝게도 다음과 같은 에러가 발생합니다.
Error
SCRIPT5002: Function expected (다르게 표시되기도 합니다.)
이 에러를 해결하기 위해서는 index.html
에 self
를 전역설정 하면 해결됩니다.
index.html 에
self
전역설정
... 생략
require([
...
],
function(ko) {
...
var self = this;
// -- 전역설정
window.self = self;
}
...
);
... 생략
그리고 index.html
에서 새로고침을 하고 다시 한번 팝업창을 띄워 실행해 보면 다음과 같이 정상 작동되는것을 확인 할 수 있습니다.
index.html 전체 코드
<!DOCTYPE html>
<html lang=ko>
<head>
<title>KO With RequireJS>팝업에서 접근하기</title>
</head>
<body>
<h1>RequireJS Popup Test</h1>
<button data-bind="click: popup">Popup</button>
<script src="/js/require.js"></script>
<script src="/js/main.js"></script>
<script>
"use strict";
require([
'ko3.4.0'
],
function(ko) {
var ViewModel = function() {
var self = this;
// -- 전역설정
window.self = self;
self.popup = function() {
window.open('Popup.html', 'pop', 'width=300,height=200');
}
self.AccessCall = function() {
alert('OK~~!');
}
};
ko.applyBindings(new ViewModel);
},
function(err) {
alert(err);
});
function AccessCall() {
self.AccessCall();
}
</script>
</body>
</html>
알고나면 아주 간단한 방법인데, 그 알기전까지의 과정은 정말 답답하죠~ ㅎ 초심을 잃지 않기 위해 오늘도 전 삽질 중입니다~
참조
- RequireJS Download : http://requirejs.org/docs/download.html#rjs
- KnockoutJS Download : http://knockoutjs.com/downloads/index.html
'Javascript > knockoutJS' 카테고리의 다른 글
INTRODUCTION (0) | 2016.07.19 |
---|