스레드에 매우 늦었지만, 내가 Angular 이전에 사용한 기술은 JSON과 JS의 유연성을 활용하여 컬렉션 키를 동적으로 참조하고 환경의 믿을 수없는 사실 (호스트 서버 이름, 현재 브라우저 언어)을 사용하는 것입니다 JSON 데이터 구조 내에서 접미사 키 이름을 선택적으로 식별 / 선호하기위한 입력으로 사용됩니다.
이는 배포 환경 컨텍스트 (OP 당)뿐만 아니라 i18n 또는 동시에 필요한 (그리고 이상적으로) 단일 구성 매니페스트 내에서 복제없이 명확하게 읽을 수있는 임의의 컨텍스트 (예 : 언어)를 제공합니다.
10 라인에 대해 바닐라 JS
지나치게 단순하지만 전형적인 예 : JSON 형식의 속성 파일에있는 API 엔드 포인트 기본 URL은 호스트 서버도 (해치) 환경에 따라 다릅니다.
...
'svcs': {
'VER': '2.3',
'API@localhost': 'http://localhost:9090/',
'API@www.uat.productionwebsite.com': 'https://www.uat.productionwebsite.com:9090/res/',
'API@www.productionwebsite.com': 'https://www.productionwebsite.com:9090/api/res/'
},
...
식별 기능의 핵심은 단순히 요청의 서버 호스트 이름입니다.
이것은 자연스럽게 사용자의 언어 설정에 따라 추가 키와 결합 될 수 있습니다.
...
'app': {
'NAME': 'Ferry Reservations',
'NAME@fr': 'Réservations de ferry',
'NAME@de': 'Fähren Reservierungen'
},
...
식별 / 기본 설정의 범위는 개별 키 (위와 같이)로 제한 될 수 있습니다. 여기서 "기본"키는 함수 입력 또는 전체 구조에 대한 일치 키 + 접미사가 있고 해당 구조 자체가있는 경우에만 덮어 씁니다. 일치하는 차별 / 우선 접미사에 대해 재귀 적으로 구문 분석됩니다.
'help': {
'BLURB': 'This pre-production environment is not supported. Contact Development Team with questions.',
'PHONE': '808-867-5309',
'EMAIL': 'coder.jen@lostnumber.com'
},
'help@www.productionwebsite.com': {
'BLURB': 'Please contact Customer Service Center',
'BLURB@fr': 'S\'il vous plaît communiquer avec notre Centre de service à la clientèle',
'BLURB@de': 'Bitte kontaktieren Sie unseren Kundendienst!!1!',
'PHONE': '1-800-CUS-TOMR',
'EMAIL': 'customer.service@productionwebsite.com'
},
따라서 프로덕션 웹 사이트를 방문하는 사용자에게 독일어 ( de ) 언어 기본 설정이있는 경우 위 구성은 다음과 같이 축소됩니다.
'help': {
'BLURB': 'Bitte kontaktieren Sie unseren Kundendienst!!1!',
'PHONE': '1-800-CUS-TOMR',
'EMAIL': 'customer.service@productionwebsite.com'
},
그러한 마법 선호도 / 차별 JSON 재 작성 기능은 어떻게 생겼습니까? 별로 :
// prefer(object,suffix|[suffixes]) by/par/durch storsoc
// prefer({ a: 'apple', a@env: 'banana', b: 'carrot' },'env') -> { a: 'banana', b: 'carrot' }
function prefer(o,sufs) {
for (var key in o) {
if (!o.hasOwnProperty(key)) continue; // skip non-instance props
if(key.split('@')[1]) { // suffixed!
// replace root prop with the suffixed prop if among prefs
if(o[key] && sufs.indexOf(key.split('@')[1]) > -1) o[key.split('@')[0]] = JSON.parse(JSON.stringify(o[key]));
// and nuke the suffixed prop to tidy up
delete o[key];
// continue with root key ...
key = key.split('@')[0];
}
// ... in case it's a collection itself, recurse it!
if(o[key] && typeof o[key] === 'object') prefer(o[key],sufs);
};
};
Angular 및 pre-Angular 웹 사이트를 포함하는 구현에서 prefer () 함수를 포함하여 JSON을 자체 실행 JS 클로저 내에 배치하고 호스트 이름 및 언어 코드 (필요한 추가 임의 접미사 허용) :
(function(prefs){ var props = {
'svcs': {
'VER': '2.3',
'API@localhost': 'http://localhost:9090/',
'API@www.uat.productionwebsite.com': 'https://www.uat.productionwebsite.com:9090/res/',
'API@www.productionwebsite.com': 'https://www.productionwebsite.com:9090/api/res/'
},
...
/* yadda yadda moar JSON und bisque */
function prefer(o,sufs) {
// body of prefer function, broken for e.g.
};
// convert string and comma-separated-string to array .. and process it
prefs = [].concat( ( prefs.split ? prefs.split(',') : prefs ) || []);
prefer(props,prefs);
window.app_props = JSON.parse(JSON.stringify(props));
})([location.hostname, ((window.navigator.userLanguage || window.navigator.language).split('-')[0]) ] );
사전 Angular 사이트는 이제 접미사 (@ 접미사 키 없음) window.app_props 를 참조하도록 축소 했습니다.
부트 스트랩 / 초기 단계 인 Angular 사이트는 단순히 삭제 된 props 객체를 $ rootScope에 복사하고 선택적으로 전역 / 창 범위에서 파기합니다.
app.constant('props',angular.copy(window.app_props || {})).run( function ($rootScope,props) { $rootScope.props = props; delete window.app_props;} );
이후 컨트롤러에 주입됩니다.
app.controller('CtrlApp',function($log,props){ ... } );
또는 뷰의 바인딩에서 참조됩니다.
<span>{{ props.help.blurb }} {{ props.help.email }}</span>
주의 사항? @ 문자는 유효한 JS / JSON 변수 / 키 이름이 아니지만 지금까지 허용됩니다. 그것이 거래를 깨뜨리는 사람이라면 "__"(이중 밑줄)과 같이 원하는 규칙을 사용하십시오.
이 기술은 서버 측에 적용 할 수 있으며 Java 또는 C #으로 이식 될 수 있지만 효율성 / 컴팩트 성은 다를 수 있습니다.
또는 함수 / 컨벤션이 프론트 엔드 컴파일 스크립트의 일부가 될 수 있으므로 전체 환경 / 모든 언어 JSON이 유선을 통해 전송되지 않습니다.
최신 정보
우리는이 기술의 사용을 키에 여러 접미사를 허용하고, 컬렉션을 강제로 사용하지 않도록하고 (여전히 원하는만큼 깊게 할 수 있음) 선호하는 접미사의 순서를 따르도록 진화했습니다.
예 (또한 작동하는 jsFiddle 참조 ) :
var o = { 'a':'apple', 'a@dev':'apple-dev', 'a@fr':'pomme',
'b':'banana', 'b@fr':'banane', 'b@dev&fr':'banane-dev',
'c':{ 'o':'c-dot-oh', 'o@fr':'c-point-oh' }, 'c@dev': { 'o':'c-dot-oh-dev', 'o@fr':'c-point-oh-dev' } };
/*1*/ prefer(o,'dev'); // { a:'apple-dev', b:'banana', c:{o:'c-dot-oh-dev'} }
/*2*/ prefer(o,'fr'); // { a:'pomme', b:'banane', c:{o:'c-point-oh'} }
/*3*/ prefer(o,'dev,fr'); // { a:'apple-dev', b:'banane-dev', c:{o:'c-point-oh-dev'} }
/*4*/ prefer(o,['fr','dev']); // { a:'pomme', b:'banane-dev', c:{o:'c-point-oh-dev'} }
/*5*/ prefer(o); // { a:'apple', b:'banana', c:{o:'c-dot-oh'} }
1/2 (기본 사용법)은 '@dev'키를 선호하고 다른 모든 접미사 키는 버립니다.
3 은 '@fr'보다 '@dev'를 선호하고 다른 모든 것보다 '@ dev & fr'을 선호합니다
4 (3과 동일하지만 '@dev'보다 '@fr'을 선호 함)
5 선호하는 접미사 없음, 모든 접미사 속성 삭제
각 접미사 속성의 점수를 매기고 속성을 반복하고 더 높은 점수의 접미사를 찾을 때 접미사 속성의 값을 접미사가없는 속성으로 승격시켜이를 수행합니다.
이 버전에서는 딥 카피에 대한 JSON 의존성을 제거하고 깊이에서 스코어링 라운드에서 살아남는 객체로만 되풀이하는 등 일부 버전의 효율성 :
function prefer(obj,suf) {
function pr(o,s) {
for (var p in o) {
if (!o.hasOwnProperty(p) || !p.split('@')[1] || p.split('@@')[1] ) continue; // ignore: proto-prop OR not-suffixed OR temp prop score
var b = p.split('@')[0]; // base prop name
if(!!!o['@@'+b]) o['@@'+b] = 0; // +score placeholder
var ps = p.split('@')[1].split('&'); // array of property suffixes
var sc = 0; var v = 0; // reset (running)score and value
while(ps.length) {
// suffix value: index(of found suffix in prefs)^10
v = Math.floor(Math.pow(10,s.indexOf(ps.pop())));
if(!v) { sc = 0; break; } // found suf NOT in prefs, zero score (delete later)
sc += v;
}
if(sc > o['@@'+b]) { o['@@'+b] = sc; o[b] = o[p]; } // hi-score! promote to base prop
delete o[p];
}
for (var p in o) if(p.split('@@')[1]) delete o[p]; // remove scores
for (var p in o) if(typeof o[p] === 'object') pr(o[p],s); // recurse surviving objs
}
if( typeof obj !== 'object' ) return; // validate
suf = ( (suf || suf === 0 ) && ( suf.length || suf === parseFloat(suf) ) ? suf.toString().split(',') : []); // array|string|number|comma-separated-string -> array-of-strings
pr(obj,suf.reverse());
}
'ngconstant:development'
에'serve'
당신이 아래 시계의 설정에 넣어 경우 -'gruntfile'
로tasks: ['ngconstant:development']
당신이 다시 시작해야하지 않습니다 -grunt serve
당신이 gruntfile에서 개발 변수를 업데이트 할 때.