Alloy에서 global 변수

Alloy에서 버전업에 되면서 Alloy.globals 가 기본적으로 세팅되어 있습니다. 이를 이용하는 방법에 대해 적어봅니다.

기존 Commonjs에서의 global

Alloy는 commonjs 모듈로 구성되어 있습니다. titanium에서 구현된 commonjs는 각 모듈 파일(require의 대상이되는 js) 간에 함께 쓸수 있는 global은 없습니다.

(단, 현재 titanium sdk 2.1.x이하 버전에서  ios의 경우는 접근이 global 영역이 모듈안에서 접근이 가능하지만 android에서는 그렇지 않습니다.  이는 appcelerator 지라의 이슈에 의하면 접근이 안되는게 맞다고 합니다.)

따라서 commonjs에서는 아래와 같은 global.js 같은 모듈을 두고 해당 모듈을 필요한 곳에서 require함으로써 global 영역을 대신할 수 있습니다.

exports.myVal = 3;
exports.myFunction = function(){
  //do something
}

 

Alloy.globals

최근 alloy가 업데이트 되면서 globals가 기본적으로 세팅이 되어 있습니다. alloy 컴파일시 생성되는 resource/app.js을 보시면 아래와 같이 정의되어 있습니다.

var Alloy = require("alloy"), _ = require("alloy/underscore")._;

Alloy.Collections = {};

Alloy.globals = {};

Alloy.CFG = require(“alloy/CFG”);

Alloy.createController(“index”);

 

따라서 Alloy의 컨트롤러(js)파일이나 tss에는 Alloy.globals로 접근이 가능합니다. Alloy가 아닌 파일에서는 Alloy만 require해주면 Alloy.globals에 접근이 가능합니다.
alloy컨트롤러 중에 가장먼저 실행되는 index.js에서(수정됨 이부분 아래 댓글 참조) alloy.js에서 global 변수들을 extend하고 다른 alloy파일에서 쓰면 되겠죠?

 

기타 config.json의 global

config.json의 global을 선언하면 Alloy.CFG를 통해 접근이 가능합니다. 이는 Alloy.globals와 비슷하지만 CFG라는 이름에서 알수 있듯이 이는 환경상수를 저장하기에 적합한것 같습니다.


Facebook Group's likes and commnets

1. 역시 그렇군요. 글로벌 영역이 없는 디자인이 더 안전하고 좋은것 같아요.

2. 제가 “꿈에서 봤나?” 했던 바로 그 내용이네요!! 하하! 감사합니다

1개의 좋아요

대현의 글을 보고 다시 살펴보니

1.

Alloy.globals를 확장하기에는 index.js보다는 alloy.js가 적합하네요.^^  더 좋은 곳이 있는데 제가 미처 몰랐습니다. (자동으로 생성된 주석에도 설명이 있네요.)
alloy.js 에 추가한 내용은 compile될때 app.js에서 index.js 의 크드보다 위에 놓여지게 됩니다.

그리고 alloy.js에서 바로 var myValue = 3; 과 같이 선언하고 다른 컨트롤러에서 myValue를 접근하는건 현재 아이폰에서만 동작합니다. 이게 잘못 구현된거라더군요. 대현의 글에서처럼 controller( commonjs 모듈)에서 쓸수 있는 글로벌 영역은 아주 없다고 보는게 맞는것 같아요. (이것도 정책이 바뀔지 모르지만 현재는 이 상태^^) 따라서 Alloy.globals에 필요한것 확장해서 쓰고 다른곳에서 Alloy.globals로 접근해서 쓰는게 좋겠죠.

2. window를 생성할때 url에 js를 지정해서 구현하면 해당 js에서 서브 컨택스트가 생성됩니다. 이 방법은 권장하고 있지 않고 commonjs 모듈 형태로 구현하는걸 추천하더군요.  이와 관련된 사항은 아래 링크를 참고

http://docs.appcelerator.com/titanium/2.0/index.html#!/api/Titanium.UI.Window 에서 sub-contexts 부분,

1. app/alloy.js 에서 정의한 글로벌 변수들에 접근 가능한 것도 appcelerator 지라 이슈에서 언급한 잘못된 구현이였나요?  그렇다면 alloy 컨트롤러에서는 글로벌 영역이 아예 없다고 볼 수 있겠네요?

 

2. (이건 전혀 다른 질문인데요)자바스크립트에서 동적으로 글로벌 컨택스트를 서브로 생성하는 방법이 있었던거 같은데, 이거 제 착각인가요?

영석님 제가 설명한건 뭐 특별한건 아니고 영석님이 사용하신 방법이랑 거의 같습니다.  단지 global을 한군데에서(index.js alloy.js) 미리 정해놓고 사용하자는 이야기 입니다. 예시는 아래와 같습니다.:)

_.extend(Alloy.globals,{
     util : require('util'),
     myVal : 3,
     myFunction : function(){
         //do something
     },
     todoCollection : Alloy.createCollection(‘Todo’),
     currentModel : null
});