থ্রেডটি খুব দেরীতে, তবে একটি প্রযুক্তি যা আমি প্রাক-কৌণিক ব্যবহার করেছি তা হ'ল জেএসওএন এবং জেএসের নমনীয়তার সাথে সংগ্রহের কীগুলি উল্লেখযোগ্যভাবে উল্লেখ করতে এবং পরিবেশের অবিচ্ছেদ্য তথ্য (হোস্ট সার্ভারের নাম, বর্তমান ব্রাউজারের ভাষা) ব্যবহার করা , ইত্যাদি) কোনও JSON ডেটা স্ট্রাকচারের মধ্যে প্রত্যয়যুক্ত মূল নামগুলি বেছে বেছে বৈষম্যমূলক / পছন্দ করার উপকরণ হিসাবে।
এটি কেবল পরিবেশ-সংক্রান্ত প্রসঙ্গটি (প্রতি ওপি প্রতি) সরবরাহ করে না তবে আই 18 এন বা একই সাথে প্রয়োজনীয় অন্য কোনও বৈকল্পিক সরবরাহ করার জন্য কোনও সালিসী প্রসঙ্গ (যেমন ভাষা) এবং (এককভাবে) কোনও একক কনফিগারেশনের মধ্যে নকল ছাড়াই এবং সহজেই সুস্পষ্টভাবে সরবরাহ করে।
প্রায় 10 লাইনে ভ্যানিলা জেএস
অতি মাত্রায় সরলীকৃত তবে ক্লাসিক উদাহরণ: একটি 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'
},
সুতরাং, যদি প্রোডাকশন ওয়েবসাইটে কোনও ভিজিটর ব্যবহারকারীর জার্মান ( ডি ) ভাষার পছন্দক্রম সেটিংস থাকে তবে উপরের কনফিগারেশনটি এতে ভেঙে পড়বে:
'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);
};
};
আমাদের বাস্তবায়নগুলিতে, যার মধ্যে কৌণিক এবং প্রাক-কৌণিক ওয়েবসাইট অন্তর্ভুক্ত রয়েছে, আমরা অন্যান্য সংস্থান কলগুলির তুলনায় জেনসনকে একটি স্ব-সম্পাদনকারী জেএস বন্ধের মধ্যে পছন্দসই () ফাংশন সহ, এবং হোস্টনামের মৌলিক বৈশিষ্ট্যগুলি খাওয়ানোর মাধ্যমে কনফিগারেশনটি কেবল বুটস্ট্র্যাপ করি and ভাষা-কোড (এবং আপনার প্রয়োজন হতে পারে এমন কোনও অতিরিক্ত স্বেচ্ছাচারিত প্রত্যয় গ্রহণ করে):
(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]) ] );
একটি প্রাক-কৌণিক সাইটটিতে এখন ধসে পড়েছে (কোন প্রত্যয়যুক্ত কী নেই) উইন্ডো app অ্যাপ_প্রেমগুলি উল্লেখ করতে হবে।
একটি কৌণিক সাইট, বুটস্ট্র্যাপ / আরআইএন পদক্ষেপ হিসাবে, মৃত-বাদ দেওয়া প্রপস বস্তুটিকে কেবল $ রুটস্কোপে অনুলিপি করে এবং (বিকল্পভাবে) এটিকে বৈশ্বিক / উইন্ডো স্কোপ থেকে ধ্বংস করে দেয়
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>
আদেশ সহকারে? @ অক্ষরটি বৈধ জেএস / জেএসএন ভেরিয়েবল / কী নামকরণ নয়, তবে এ পর্যন্ত গ্রহণযোগ্য। যদি এটি ডিল-ব্রেকার হয় তবে আপনি যে কোনও কনভেনশন পছন্দ করুন যেমন "__" (ডাবল আন্ডারস্কোর) যতক্ষণ না আপনি এতে আটকে থাকেন।
কৌশলটি জাভা বা সি # তে পোর্ট করা সার্ভার-সাইড প্রয়োগ করা যেতে পারে তবে আপনার দক্ষতা / সংকোচনেতা ভিন্ন হতে পারে।
পর্যায়ক্রমে, ফাংশন / সম্মেলনটি আপনার ফ্রন্ট-এন্ড সংকলিত স্ক্রিপ্টের অংশ হতে পারে, যাতে সম্পূর্ণ গোররি অল-এনভায়রনমেন্ট / সর্ব-ভাষা জেএসওএন তারের উপর দিয়ে কখনই সংক্রমণিত হয় না।
হালনাগাদ
একাধিক প্রত্যয়কে কী ব্যবহারের জন্য অনুমতি দিতে, সংগ্রহগুলি ব্যবহার করতে বাধ্য করা এড়াতে (আপনি এখনও যতটা গভীরভাবে আপনি চান হিসাবে এটি করতে পারেন) এড়াতে এবং পছন্দসই প্রত্যয়গুলির ক্রমকে সম্মান করার জন্য আমরা এই কৌশলটির ব্যবহার বিকাশ করেছি।
উদাহরণ (এছাড়াও জেএসফিডেল কাজ দেখুন ):
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'} }
১/২ (বেসিক ব্যবহার) '@ দেব' কীগুলি পছন্দ করে, অন্যান্য সমস্ত প্রত্যয়যুক্ত কীগুলি বর্জন করে
3 '@fr' এর চেয়ে '@ দেব' 'কে পছন্দ করে, অন্য সকলের চেয়ে' @ ডিভ এন্ড ফ্র 'পছন্দ করে
4 (3 এর মতো তবে '@ দেব' এর চেয়ে '@fr' পছন্দ করে)
5 কোনও পছন্দসই প্রত্যয় নয়, সমস্ত প্রত্যয়যুক্ত বৈশিষ্ট্য হ্রাস করে
এটি প্রতিটি প্রত্যয়যুক্ত সম্পত্তি স্কোর করে এবং বৈশিষ্ট্যগুলির উপর পুনরাবৃত্তি করার সময় এবং উচ্চতর স্কোর প্রত্যয়টি সন্ধান করার সময় অ-প্রত্যয়িত সম্পত্তিতে একটি প্রত্যয়িত সম্পত্তিটির মূল্য প্রচার করে এটি সম্পাদন করে।
এই সংস্করণে কিছু কার্যকারিতা, জেএসএন-এর উপর নির্ভর করে ডিপ-কপির উপর নির্ভরতা অপসারণ করা এবং কেবলমাত্র এমন বস্তুগুলিতে পুনরাবৃত্তি করা যা স্কোরিং রাউন্ডে তাদের গভীরতায় বেঁচে থাকে:
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 উন্নয়ন ভেরিয়েবল আপডেট করুন।