Angular.js এ আমি কীভাবে বিভিন্ন পরিবেশ কনফিগার করব?


220

আপনি বিভিন্ন পরিবেশের জন্য কনফিগারেশন ভেরিয়েবল / ধ্রুবককে কীভাবে পরিচালনা করবেন?

এটি একটি উদাহরণ হতে পারে:

আমার বিশ্রামের এপিআইটি অ্যাক্সেসযোগ্য localhost:7080/myapi/, তবে আমার বন্ধু যে গিট সংস্করণ নিয়ন্ত্রণের অধীনে একই কোডে কাজ করে তাতে তার টমক্যাট অন এপিআই মোতায়েন রয়েছে localhost:8099/hisapi/

ধরুন আমাদের কাছে এরকম কিছু রয়েছে:

angular
    .module('app', ['ngResource'])

    .constant('API_END_POINT','<local_end_point>')

    .factory('User', function($resource, API_END_POINT) {
        return $resource(API_END_POINT + 'user');
    });

পরিবেশের উপর নির্ভর করে আমি কীভাবে এপিআই এন্ডপয়েন্টের সঠিক মান ইনজেক্ট করব?

পিএইচপি-তে আমি সাধারণত কোনও config.username.xmlফাইলের সাথে এই জাতীয় জিনিসগুলি করি, ব্যবহারকারীর নাম দ্বারা স্বীকৃত স্থানীয় পরিবেশ কনফিগারেশন ফাইলের সাথে বেসিক কনফিগারেশন ফাইল (config.xML) মার্জ করে। তবে আমি জাভাস্ক্রিপ্টে এই জাতীয় জিনিস পরিচালনা করতে জানি না?

উত্তর:


209

আমি থ্রেডে কিছুটা দেরি করেছি, তবে আপনি গ্রান্ট ব্যবহার করলে আমার দুর্দান্ত সাফল্য হয়েছিল grunt-ng-constant

ngconstantআমার Gruntfile.jsচেহারাগুলির জন্য কনফিগার বিভাগটি

ngconstant: {
  options: {
    name: 'config',
    wrap: '"use strict";\n\n{%= __ngModule %}',
    space: '  '
  },
  development: {
    options: {
      dest: '<%= yeoman.app %>/scripts/config.js'
    },
    constants: {
      ENV: 'development'
    }
  },
  production: {
    options: {
      dest: '<%= yeoman.dist %>/scripts/config.js'
    },
    constants: {
      ENV: 'production'
    }
  }
}

যে কাজগুলি ব্যবহার করা হয় সেগুলি ngconstantদেখতে দেখতে ভাল লাগে

grunt.registerTask('server', function (target) {
  if (target === 'dist') {
    return grunt.task.run([
      'build',
      'open',
      'connect:dist:keepalive'
    ]);
  }

  grunt.task.run([
    'clean:server',
    'ngconstant:development',
    'concurrent:server',
    'connect:livereload',
    'open',
    'watch'
  ]);
});

grunt.registerTask('build', [
  'clean:dist',
  'ngconstant:production',
  'useminPrepare',
  'concurrent:dist',
  'concat',
  'copy',
  'cdnify',
  'ngmin',
  'cssmin',
  'uglify',
  'rev',
  'usemin'
]);

সুতরাং চলমান দেখতে grunt serverএকটি config.jsফাইল উত্পন্ন করবেapp/scripts/

"use strict";
angular.module("config", []).constant("ENV", "development");

পরিশেষে, আমি মডিউলগুলির যা প্রয়োজন তার উপর নির্ভরতা ঘোষণা করি:

// the 'config' dependency is generated via grunt
var app = angular.module('myApp', [ 'config' ]);

এখন আমার ধ্রুবকগুলি যেখানে প্রয়োজন সেখানে নির্ভরতা ইনজেকশন হতে পারে। যেমন,

app.controller('MyController', ['ENV', function( ENV ) {
  if( ENV === 'production' ) {
    ...
  }
}]);

10
বরং নির্বাণ চেয়ে 'ngconstant:development'মধ্যে 'serve'আপনি অধীনে ঘড়ির কনফিগ এটা করা - 'gruntfile'যেমন tasks: ['ngconstant:development']আপনি পুনর্সূচনা করার প্রয়োজন হবে না - grunt serveযখন আপনি gruntfile উন্নয়ন ভেরিয়েবল আপডেট করুন।
স্পেনথিল

10
Gruntfile.js এ আপনার ধ্রুবকগুলি যুক্ত করার পরিবর্তে আপনি আলাদা আলাদা ফাইল রাখতে পারেন:package: grunt.file.readJSON('development.json')
গিলহেম সোলাস

3
গ্রান্টফাইল.জেএস-এর জন্য গ্রান্ট-এনজি- কনস্ট্যান্টের 0.5 সংস্করণে একটি আপডেট বাক্য গঠন রয়েছে: github.com/werk85/grunt-ng-constant/issues/31 । দুর্দান্ত উত্তর, ধন্যবাদ!
ফেরিস

10
যারা ঝাঁকুনি ব্যবহার করেন তাদের জন্য রয়েছে গল্প-এনজি-ধ্রুবক
ধীররাজ ভেকাকোমা

4
আমি খুঁজে পেয়েছি যে স্ক্রিপ্টস / কনফিগারেশন ফাইলগুলি কৌণিকের সাথে কৌণিকের মধ্যেও অন্তর্ভুক্ত করা দরকার, যেমন: <স্ক্রিপ্ট src = "স্ক্রিপ্ট / কনফিগারেশন"> </script>
টনি গেমজ

75

একটি শীতল সমাধান হতে পারে সমস্ত পরিবেশ-নির্দিষ্ট মানগুলিকে কিছু পৃথক কৌণিক মডিউলে পৃথক করা, যা অন্য সমস্ত মডিউল নির্ভর করে:

angular.module('configuration', [])
       .constant('API_END_POINT','123456')
       .constant('HOST','localhost');

তারপরে আপনার মডিউলগুলির যেগুলি এন্ট্রিগুলির প্রয়োজন সেগুলি তার উপর নির্ভরতা ঘোষণা করতে পারে:

angular.module('services',['configuration'])
       .factory('User',['$resource','API_END_POINT'],function($resource,API_END_POINT){
           return $resource(API_END_POINT + 'user');
       });

এখন আপনি আরও দুর্দান্ত জিনিস সম্পর্কে চিন্তা করতে পারেন:

মডিউলটি, যাতে কনফিগারেশন রয়েছে সেগুলি আপনার পৃষ্ঠায় অন্তর্ভুক্ত করা হবে s

এই স্ক্রিপ্টটি আপনি প্রত্যেকেই সহজেই সম্পাদনা করতে পারবেন, যতক্ষণ না আপনি এই পৃথক ফাইলটিকে গিট হিসাবে পরীক্ষা করেন না। তবে এটি কোনও পৃথক ফাইলে থাকলে কনফিগারেশনটি পরীক্ষা না করা সহজ। এছাড়াও, আপনি স্থানীয়ভাবে এটি শাখা করতে পারে।

এখন, আপনার যদি এএনটি বা ম্যাভেনের মতো একটি বিল্ড-সিস্টেম থাকে, তবে আপনার পরবর্তী পদক্ষেপগুলি API_END_POINT মানগুলির জন্য কিছু স্থানধারককে বাস্তবায়িত করতে পারে, যা আপনার নির্দিষ্ট মানগুলির সাথে বিল্ড-টাইমের সময় প্রতিস্থাপন করা হবে।

অথবা আপনার configuration_a.jsএবং আপনার configuration_b.jsঅন্তর্ভুক্ত করার জন্য ব্যাকএন্ডে সিদ্ধান্ত নিন।


30

জন্য Gulp ব্যবহারকারী, নি: শ্বাসে-NG-ধ্রুবক এছাড়াও সঙ্গে মিলিত হয় নি: শ্বাসে-CONCAT , ঘটনা-স্ট্রীম এবং yargs

var concat = require('gulp-concat'),
    es = require('event-stream'),
    gulp = require('gulp'),
    ngConstant = require('gulp-ng-constant'),
    argv = require('yargs').argv;

var enviroment = argv.env || 'development';

gulp.task('config', function () {
  var config = gulp.src('config/' + enviroment + '.json')
    .pipe(ngConstant({name: 'app.config'}));
  var scripts = gulp.src('js/*');
  return es.merge(config, scripts)
    .pipe(concat('app.js'))
    .pipe(gulp.dest('app/dist'))
    .on('error', function() { });
});

আমার কনফিগার ফোল্ডারে আমার এই ফাইলগুলি রয়েছে:

ls -l config
total 8
-rw-r--r--+ 1 .. ci.json
-rw-r--r--+ 1 .. development.json
-rw-r--r--+ 1 .. production.json

তারপরে আপনি দৌড়াতে পারবেন gulp config --env developmentএবং এটি এমন কিছু তৈরি করবে:

angular.module("app.config", [])
.constant("foo", "bar")
.constant("ngConstant", true);

আমারও এই অনুমান আছে:

beforeEach(module('app'));

it('loads the config', inject(function(config) {
  expect(config).toBeTruthy();
}));

গুলপ এনজি ধ্রুবক সহ নির্ভরতা অ্যারে সরানোর কোনও উপায় আছে কি? আপনার যেমন আমার যেমন "এনজিএনেমেট" রয়েছে তেমন আমার কনস্ট্যান্টগুলির সাথে কোনও নির্ভরতা নেই। আমি যদি এটি অন্তর্ভুক্ত না করি তবে আমি কৌনিক.মুডুল ("my.module.config", []) হিসাবে একটি খালি নির্ভরতা অ্যারে পাই তবে আমি আউটপুটটি কৌনিক.মুডুল ("my.module.config") হিসাবে চাই। আমি গুল্প এনজিস্টে কোনও বিকল্প দেখতে পাচ্ছি না তবে আমি দেখতে পাচ্ছি যে আপনি ডিপগুলি পাস করতে পারবেন: গ্রান্ট এনজিবি ধ্রুবক প্যাকেজটিতে মিথ্যা। কোন সাহায্য?
অরুণ গোপালপুরী

17

এটি অর্জনের জন্য, আমি আপনাকে AngularJS এনভায়রনমেন্ট প্লাগইন ব্যবহার করার পরামর্শ দিই: https://www.npmjs.com/package/angular-en पर्यावरण

এখানে একটি উদাহরণ:

angular.module('yourApp', ['environment']).
config(function(envServiceProvider) {
    // set the domains and variables for each environment 
    envServiceProvider.config({
        domains: {
            development: ['localhost', 'dev.local'],
            production: ['acme.com', 'acme.net', 'acme.org']
            // anotherStage: ['domain1', 'domain2'], 
            // anotherStage: ['domain1', 'domain2'] 
        },
        vars: {
            development: {
                apiUrl: '//localhost/api',
                staticUrl: '//localhost/static'
                // antoherCustomVar: 'lorem', 
                // antoherCustomVar: 'ipsum' 
            },
            production: {
                apiUrl: '//api.acme.com/v2',
                staticUrl: '//static.acme.com'
                // antoherCustomVar: 'lorem', 
                // antoherCustomVar: 'ipsum' 
            }
            // anotherStage: { 
            //  customVar: 'lorem', 
            //  customVar: 'ipsum' 
            // } 
        }
    });

    // run the environment check, so the comprobation is made 
    // before controllers and services are built 
    envServiceProvider.check();
});

এবং তারপরে, আপনি আপনার নিয়ন্ত্রকদের কাছ থেকে ভেরিয়েবলগুলিকে কল করতে পারেন যেমন:

envService.read('apiUrl');

আশা করি এটা সাহায্য করবে.


1
তিনি কীভাবে উন্নয়ন এবং উত্পাদন মধ্যে পরিবর্তন করতে পারেন?
মাওগ বলছে মনিকা

হাই জুয়ান পাবলো, বা আপনি যদি এটি খুঁজে পেয়ে থাকেন তবে @ মওগ। আমি এসও-তে কোনও প্রশ্ন জিজ্ঞাসা করার আগে / গিথুবকে কোনও বিষয় উত্থাপন করার আগে; কিভাবে angular-environmentপরিবেশ সনাক্ত করতে পারে? অর্থাৎ আপনার স্থানীয় মেশিন / ওয়েব সার্ভারে আপনাকে কী করতে হবে যাতে এটি জেনে যায় যে এটি যথাক্রমে দেব / প্রোড?
স্টিভিপ

দস্তাবেজগুলি আবার পড়া ... " envServiceProvider.check()... স্বয়ংক্রিয়ভাবে প্রদত্ত ডোমেনগুলির উপর ভিত্তি করে উপযুক্ত পরিবেশ সেট করবে"। সুতরাং আমি এটি গণ্য করি যে এটি বর্তমান ডোমেন সনাক্ত করে এবং পরিবেশকে যথাযথভাবে সেট করে - এটি পরীক্ষা করার সময়!
স্টিভিপ

13

আপনি lvh.me:9000আপনার AngularJS অ্যাপ্লিকেশনটি অ্যাক্সেস করতে ব্যবহার করতে পারেন ( lvh.me127.0.0.1 এ কেবলমাত্র পয়েন্ট করেছেন) এবং তারপরে lvh.meহোস্ট হলে আলাদা প্রান্তটি নির্দিষ্ট করতে পারেন :

app.service("Configuration", function() {
  if (window.location.host.match(/lvh\.me/)) {
    return this.API = 'http://localhost\\:7080/myapi/';
  } else {
    return this.API = 'http://localhost\\:8099/hisapi/';
  }
});

এবং তারপরে কনফিগারেশন পরিষেবাটি ইনজেক্ট করুন এবং Configuration.APIযেখানেই আপনার API টি অ্যাক্সেস করতে হবে সেখানে ব্যবহার করুন :

$resource(Configuration.API + '/endpoint/:id', {
  id: '@id'
});

একটি বাচ্চা ক্লানকি, তবে কিছুটা ভিন্ন পরিস্থিতিতে আমার পক্ষে কাজ করে (এপিআই এন্ডপয়েন্টগুলি উত্পাদন ও বিকাশে পৃথক হয়)।


1
তাই আমার মনে হয় প্রায়শই লোকেরা জটিল জিনিসগুলিকে অতিরিক্ত জটিল করে তোলে। এর সহজ ব্যবহার window.location.hostআমার পক্ষে যথেষ্ট ছিল।
জোসিয়াম

7

আমরাও এরকম কিছু করতে পারি।

(function(){
    'use strict';

    angular.module('app').service('env', function env() {

        var _environments = {
            local: {
                host: 'localhost:3000',
                config: {
                    apiroot: 'http://localhost:3000'
                }
            },
            dev: {
                host: 'dev.com',
                config: {
                    apiroot: 'http://localhost:3000'
                }
            },
            test: {
                host: 'test.com',
                config: {
                    apiroot: 'http://localhost:3000'
                }
            },
            stage: {
                host: 'stage.com',
                config: {
                apiroot: 'staging'
                }
            },
            prod: {
                host: 'production.com',
                config: {
                    apiroot: 'production'
                }
            }
        },
        _environment;

        return {
            getEnvironment: function(){
                var host = window.location.host;
                if(_environment){
                    return _environment;
                }

                for(var environment in _environments){
                    if(typeof _environments[environment].host && _environments[environment].host == host){
                        _environment = environment;
                        return _environment;
                    }
                }

                return null;
            },
            get: function(property){
                return _environments[this.getEnvironment()].config[property];
            }
        }

    });

})();

এবং আপনার মধ্যে controller/service, আমরা নির্ভরতা ইনজেকশন করতে এবং সম্পত্তিটি অ্যাক্সেস করার জন্য গেট পদ্ধতিটি কল করতে পারি।

(function() {
    'use strict';

    angular.module('app').service('apiService', apiService);

    apiService.$inject = ['configurations', '$q', '$http', 'env'];

    function apiService(config, $q, $http, env) {

        var service = {};
        /* **********APIs **************** */
        service.get = function() {
            return $http.get(env.get('apiroot') + '/api/yourservice');
        };

        return service;
    }

})();

$http.get(env.get('apiroot') হোস্ট পরিবেশের উপর ভিত্তি করে url ফিরিয়ে দেয়।


5

ভাল প্রশ্ন!

এর একটি সমাধান হ'ল আপনার কনফিগার.এক্সএমএল ফাইলটি ব্যবহার চালিয়ে যাওয়া, এবং ব্যাকএন্ড থেকে আপনার উত্পন্ন এইচটিএমএলকে এপিআই সমাপ্তি তথ্য সরবরাহ করা যেতে পারে, যেমন (পিএইচপি তে উদাহরণ):

<script type="text/javascript">
angular.module('YourApp').constant('API_END_POINT', '<?php echo $apiEndPointFromBackend; ?>');
</script>

সম্ভবত একটি সুন্দর সমাধান না, তবে এটি কার্যকর হবে।

আর একটি সমাধান হতে পারে API_END_POINT হ'ল উত্পাদনের মতো ধ্রুবক মান , এবং সেই পরিবর্তে আপনার স্থানীয় এপিআইতে url নির্দেশ করতে আপনার হোস্ট-ফাইলটি পরিবর্তন করুন।

বা localStorageওভাররাইডগুলির জন্য ব্যবহার করে এমন কোনও সমাধান হতে পারে:

.factory('User',['$resource','API_END_POINT'],function($resource,API_END_POINT){
   var myApi = localStorage.get('myLocalApiOverride');
   return $resource((myApi || API_END_POINT) + 'user');
});

হাই জোয়াকিম্বেং, আমি পয়েন্টটি ব্যাখ্যা করার জন্য পিএইচপি ব্যবহার করে সমাধানটি লিখেছি। আমরা খাঁটি আরএসএফুল জাভা ব্যাকএন্ডের সাথে একটি খাঁটি জাভাস্ক্রিপ্ট ক্লায়েন্ট কোড করার চেষ্টা করছি, যাতে পিএইচপি / জেএস মিশ্রণটি এটি আমার ক্ষেত্রে নয় এবং আমি যখন পিএইচপি লিখি তখন আমি সর্বদা পিএইচপি এবং জেএস মিশ্রিত না রাখার চেষ্টা করি। তবে উত্তরের জন্য ধন্যবাদ আমি মনে করি @kfis উত্তর সমাধানটি কাজ করতে পারে: একটি কনফিগারেশন.জেএস ফাইল ভার্সন নিয়ন্ত্রণের অধীনে নয় যাতে একটি কনফিগারেশন মডিউল থাকে। এই পদ্ধতির সাহায্যে আমি পরীক্ষার প্রয়োজনে আলাদা কনফিগারেশন মডিউলও ইনজেকশন / লোড করতে পারি, যদি এটি প্রয়োজন হয়। ধন্যবাদ বন্ধুরা.
rbarilani

@ hal9087 আমি মিশ্রিত ভাষাগুলির অংশ সম্পর্কে সম্পূর্ণরূপে একমত, এটিকে কোনও মূল্যে এড়ানো উচিত :) আমি কনফিগারেশন.জেস এর সমাধানও পছন্দ করি, যখন আমার অনুরূপ কিছু প্রয়োজন হবে তখন আমি এটি মাথায় রাখব!
জোয়াকিম্বেং

4

থ্রেডটি খুব দেরীতে, তবে একটি প্রযুক্তি যা আমি প্রাক-কৌণিক ব্যবহার করেছি তা হ'ল জেএসওএন এবং জেএসের নমনীয়তার সাথে সংগ্রহের কীগুলি উল্লেখযোগ্যভাবে উল্লেখ করতে এবং পরিবেশের অবিচ্ছেদ্য তথ্য (হোস্ট সার্ভারের নাম, বর্তমান ব্রাউজারের ভাষা) ব্যবহার করা , ইত্যাদি) কোনও 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());
}


-8

আপনি এই প্রশ্ন এবং এর উত্তর দেখেছেন ?

আপনি আপনার অ্যাপের জন্য বিশ্বব্যাপী বৈধ মানটি সেট করতে পারেন:

app.value('key', 'value');

এবং তারপরে এটি আপনার পরিষেবাগুলিতে ব্যবহার করুন। আপনি এই কোডটি একটি config.js ফাইলে স্থানান্তর করতে এবং পৃষ্ঠা লোড বা অন্য কোনও সুবিধাজনক মুহুর্তে এটিকে সম্পাদন করতে পারেন।


7
কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন এটি এত খারাপ উত্তর? এটি ব্যাপকভাবে
হ্রাস পেয়েছে

5
এটি জাহান্নাম হিসাবে পুরানো, তবে যদি আমাকে অনুমান করতে হয় যে ডাউনভোটগুলি কেন, কারণ এটি পরিবেশের নির্দিষ্ট কনফিগারেশনের সমস্যাটির সমাধান করে না, এটি কোনও পুরানো অ্যাপ্লিকেশনে বৈশ্বিক মান নির্ধারণের জন্য .value () ব্যবহার করার পরামর্শ মাত্র। মূল প্রশ্নগুলির পরামিতিগুলির সাথে এনভি বা কোনও কিছুর উপর নির্ভর করে কেউ কীভাবে এটি ব্যবহার করবে সে সম্পর্কে কোনও উল্লেখ নেই।
coblr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.