App.config এ ইনজেকশন পরিষেবা


168

আমি অ্যাপ্লিকেশন কনফিগে কোনও পরিষেবা ইনজেকশন করতে চাই, যাতে কন্ট্রোলার বলার আগে ডেটা পুনরুদ্ধার করা যায়। আমি এটির মতো চেষ্টা করেছি:

সার্ভিস:

app.service('dbService', function() {
    return {
        getData: function($q, $http) {
            var defer = $q.defer();
            $http.get('db.php/score/getData').success(function(data) {
                defer.resolve(data);            
            });
            return defer.promise;
        }
    };
});

কনফিগ:

app.config(function ($routeProvider, dbService) {
    $routeProvider
        .when('/',
        {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                data: dbService.getData(),
            }
        })
});

তবে আমি এই ত্রুটিটি পেয়েছি:

ত্রুটি: অজানা সরবরাহকারী: সম্পাদক অ্যাপ্লিকেশন থেকে ডিবি সার্ভিস

কীভাবে সেটআপটি সংশোধন করবেন এবং এই পরিষেবাটি ইনজেক্ট করবেন?


3
আপনি ইতিমধ্যে দেখেছি সত্ত্বেও, সেখানে হয় একটি উপায় আপনি কি উদ্দেশ্যে, অর্জন এবং AngularJS অনেক সময় অতিবাহিত হয়েছে কার্যকারিতা এই ধরনের সক্রিয়। এটি কীভাবে অর্জন করা যায় সে সম্পর্কে আমার উত্তর পর্যালোচনা করুন।
ব্রায়ান ভ্যান্ডারবাউশ

উত্তর:


131

আপনি যা করতে চাইছেন তা করতে সক্ষম না হবার জন্য অ্যালেক্স সঠিক কারণ প্রদান করেছিলেন, সুতরাং +1। তবে আপনি এই সমস্যাটির মুখোমুখি হচ্ছেন কারণ আপনি কীভাবে ডিজাইন করেছেন তা সমাধান করে আপনি যথেষ্ট ব্যবহার করছেন না।

resolveহয় কোনও পরিষেবার স্ট্রিং বা কোনও ফাংশন লাগে যা ইনজেকশনের জন্য মান ফেরত দেয়। যেহেতু আপনি উত্তরোত্তরটি করছেন, আপনার একটি আসল ফাংশনটি পাস করতে হবে:

resolve: {
  data: function (dbService) {
    return dbService.getData();
  }
}

ফ্রেমওয়ার্কটি সমাধান করতে গেলে data, এটি dbServiceফাংশনে ইনজেক্ট করবে যাতে আপনি নিখরচায় এটি ব্যবহার করতে পারেন। এটি configসম্পাদন করার জন্য আপনাকে মোটেও ব্লকের মধ্যে ইনজেকশনের দরকার নেই ।

বন ক্ষুধা!


2
ধন্যবাদ! তবে, আমি যদি এটি করি তবে আমি পেয়েছি: ত্রুটি: 'অপরিজ্ঞাত' পরিষেবাতে কোনও অবজেক্ট ('$ q.defer' মূল্যায়ন) নয়।
dndr

1
ইনজেকশনটি শীর্ষ-স্তরের ফাংশনটিতে চলে আসে .service, তাই সেখানে যান $qএবং $httpযান।
জোশ ডেভিড মিলার

1
@ এক্সএমএললি একটি রেজোলিউশনের স্ট্রিংটি আসলে কোনও পরিষেবার নাম এবং পরিষেবাতে কোনও নির্দিষ্ট ফাংশন নয়। আপনার উদাহরণ ব্যবহার করে, আপনি করতে পারেন pageData: 'myData', তবে আপনাকে তখন pageData.overviewআপনার নিয়ামকের কাছ থেকে কল করতে হবে । স্ট্রিং পদ্ধতি সম্ভবত তখনই কার্যকর যখন পরিষেবা ফ্যাক্টরি কোনও এপিআইয়ের পরিবর্তে প্রতিশ্রুতি ফেরত দেয়। সুতরাং আপনি বর্তমানে যেভাবে এটি করছেন এটি সম্ভবত সেরা উপায়।
জোশ ডেভিড মিলার

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

1
@ জোশডাভিডমিলার আমি যে পদ্ধতিটি দেখিয়েছি তা ব্যবহার করে, রাষ্ট্রীয় সক্রিয়করণের পূর্বে কোনও পরিষেবা কনফিগার করা সম্ভব, যেমন কনফিগার পর্যায়ে ত্রুটিগুলি নিক্ষেপ / পরিচালনা করা যায়, আপনি কীভাবে অ্যাপ্লিকেশন বুটস্ট্র্যাপিংয়ের আগে অন্যান্য কনফিগারেশন মানগুলি ইনস্ট্যান্ট করবেন তা সম্ভাব্যভাবে পরিবর্তন করে। উদাহরণস্বরূপ, অ্যাপ্লিকেশনটির সঠিক বৈশিষ্ট্য সংকলন করতে কোনও ব্যবহারকারীর ভূমিকা নির্ধারণ করা।
ব্রায়ান ভ্যান্ডারবাউশ

140

আপনার পরিষেবাটি একটি কাস্টম অ্যাঙ্গুলারজেএস সরবরাহকারী হিসাবে সেট আপ করুন

স্বীকৃত উত্তর যা বলেছে তা সত্ত্বেও, আপনি আসলে যা করতে চেয়েছিলেন তা করতে পারেন তবে কনফিগারেশন সরবরাহকারী হিসাবে আপনাকে এটি সেট আপ করতে হবে, যাতে এটি কনফিগারেশন পর্বের সময় পরিষেবা হিসাবে পাওয়া যায় .. প্রথমে আপনার Serviceসরবরাহকারীর সাথে পরিবর্তন করুন নিচে দেখানো হয়েছে. এখানে মূল পার্থক্যটি হ'ল মান নির্ধারণের পরে defer, আপনি defer.promiseসম্পত্তিটি প্রতিশ্রুতি দেওয়া বস্তুতে সেট করে দিয়েছিলেন $http.get:

সরবরাহকারী পরিষেবা: (সরবরাহকারী: পরিষেবা রেসিপি)

app.provider('dbService', function dbServiceProvider() {

  //the provider recipe for services require you specify a $get function
  this.$get= ['dbhost',function dbServiceFactory(dbhost){
     // return the factory as a provider
     // that is available during the configuration phase
     return new DbService(dbhost);  
  }]

});

function DbService(dbhost){
    var status;

    this.setUrl = function(url){
        dbhost = url;
    }

    this.getData = function($http) {
        return $http.get(dbhost+'db.php/score/getData')
            .success(function(data){
                 // handle any special stuff here, I would suggest the following:
                 status = 'ok';
                 status.data = data;
             })
             .error(function(message){
                 status = 'error';
                 status.message = message;
             })
             .then(function(){
                 // now we return an object with data or information about error 
                 // for special handling inside your application configuration
                 return status;
             })
    }    
}

এখন, আপনার কাছে একটি কনফিগারযোগ্য কাস্টম সরবরাহকারী রয়েছে, আপনাকে কেবল এটি ইনজেক্ট করতে হবে। "আপনার ইনজেক্টেবল সরবরাহকারী" অনুপস্থিত হওয়ায় এখানে মূল পার্থক্য।

কনফিগ:

app.config(function ($routeProvider) { 
    $routeProvider
        .when('/', {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                dbData: function(DbService, $http) {
                     /*
                     *dbServiceProvider returns a dbService instance to your app whenever
                     * needed, and this instance is setup internally with a promise, 
                     * so you don't need to worry about $q and all that
                     */
                    return DbService('http://dbhost.com').getData();
                }
            }
        })
});

আপনার মধ্যে সমাধান ডেটা ব্যবহার করুন appCtrl

app.controller('appCtrl',function(dbData, DbService){
     $scope.dbData = dbData;

     // You can also create and use another instance of the dbService here...
     // to do whatever you programmed it to do, by adding functions inside the 
     // constructor DbService(), the following assumes you added 
     // a rmUser(userObj) function in the factory
     $scope.removeDbUser = function(user){
         DbService.rmUser(user);
     }

})

সম্ভাব্য বিকল্প

নিম্নলিখিত বিকল্পটি একটি অনুরূপ পদ্ধতির, তবে .configআপনার অ্যাপ্লিকেশনের প্রসঙ্গে নির্দিষ্ট মডিউলের মধ্যে পরিষেবাটি আবদ্ধ করে, সংজ্ঞায়িত হওয়ার অনুমতি দেয় । আপনার জন্য সঠিক যে পদ্ধতিটি চয়ন করুন। এই সমস্ত জিনিসের হ্যাং পেতে আপনাকে সহায়তা করতে তৃতীয় বিকল্প এবং সহায়ক লিঙ্কগুলির নোটগুলির জন্য নীচে দেখুন

app.config(function($routeProvider, $provide) {
    $provide.service('dbService',function(){})
    //set up your service inside the module's config.

    $routeProvider
        .when('/', {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                data: 
            }
        })
});

কয়েকটি সহায়ক সংস্থান

  • জন লিন্ডকুইস্টের এন্ডহেড.আইও- তে একটি দুর্দান্ত 5 মিনিটের ব্যাখ্যা এবং বিক্ষোভ রয়েছে , এবং এটি একটি নিখরচায় পাঠ! আমি মূলত $httpএই অনুরোধের প্রসঙ্গে নির্দিষ্ট করে তার প্রদর্শনকে সংশোধন করেছি
  • সরবরাহকারীগুলিতে অ্যাঙ্গুলারজেএস বিকাশকারী গাইড দেখুন
  • সম্পর্কে factory/ service/ provider clevertech.biz এ একটি দুর্দান্ত ব্যাখ্যা রয়েছে

সরবরাহকারী আপনাকে .serviceপদ্ধতির তুলনায় আরও কিছুটা কনফিগারেশন দেয় যা এটি অ্যাপ্লিকেশন স্তরের সরবরাহকারী হিসাবে আরও ভাল করে তোলে তবে আপনি এটি কনফিগার ইনজেক্টের $provideমাধ্যমে কনফিগার করে নিতে পারেন:


2
ধন্যবাদ, আমি এই জাতীয় উদাহরণ খুঁজছিলাম; বিস্তারিত উত্তর এবং দুর্দান্ত লিঙ্কগুলি!
cnlevy

1
সমস্যা নেই! এটি আমার প্রিয় উত্তর favorite আমি বর্তমানে এটির উত্তর দিয়েছি যখন ইতিমধ্যে গৃহীত উত্তর ইতিমধ্যে উত্তর পেয়েছে, এবং 18 টি ভোট ছিল। কয়েকটি ব্যাজ জন্য ভাল!
ব্রায়ান ভ্যান্ডারবাউশ

আপনার কোডপেন নমুনাগুলি যদি কাজ করে তবে এটি সত্যই কার্যকর হবে। উদাহরণস্বরূপ, $ Provider.service ('dbS सर्विस', ফাংশন () $ এ $ এইচটি এইচটি ইনজেক্ট করা হয়নি তবে এটি তার শরীরে ব্যবহার করে it যেমন দাঁড়িয়ে আছে, আমি আপনার কৌশল 2 টি কাজ করতে পারিনি It's এটি অত্যন্ত হতাশার কারণ that শুরুতে একটি কৌণিক প্রোগ্রামে একটি অপসারণ ফাইল থেকে কনফিগার ডেটা লোড করা এত কঠিন
বার্নার্ড

@ অ্যালকালাইন আমি এই পোস্টের পরে থেকে একটি বা দুটি জিনিস শিখেছি। উত্তরটি তত্ত্বের ক্ষেত্রে সঠিক তবে এতে 1 বা 2 টি জিনিস রয়েছে (1 আপনি দেখিয়েছেন) যা ঠিক করা উচিত। মন্তব্যের জন্য ধন্যবাদ. আমি উত্তরটি পর্যালোচনা করব এবং আপডেট করব। এই মুহুর্তের জন্য কোডপেন মোছা হয়েছে ... এটি শেষ করার কোনও সুযোগ কখনও হয়নি।
ব্রায়ান ভ্যান্ডারবাউশ

5
আমি মনে করি আপনি এখানে সরবরাহিত তথ্য ভুল। আপনি কোনও সরবরাহকারী ব্যবহার করতে পারেন তবে কনফিগার পর্যায়ে আপনি $getকলটির ফলাফল নিয়ে কাজ করছেন না । পরিবর্তে আপনি সরবরাহকারীর উদাহরণগুলিতে পদ্ধতিগুলি যুক্ত করতে চান এবং thisযখন আপনি কল করবেন তখনই ফিরে আসুন $get। প্রকৃতপক্ষে আপনার উদাহরণে আপনি কেবল একটি পরিষেবা ব্যবহার করতে পারেন ... একটি সরবরাহকারীর মধ্যে আপনিও পছন্দ মতো পরিষেবা ইনজেকশন করতে পারবেন না $http। এবং //return the factory as a provider, that is available during the configuration phase
বিটিডব্লিউ

21

সংক্ষিপ্ত উত্তর: আপনি পারবেন না। অ্যাংুলারজেএস আপনাকে কনফিগারেশনে পরিষেবাগুলি ইনজেক্ট করার অনুমতি দেবে না কারণ এটি নিশ্চিত হওয়া যায় না যে সেগুলি সঠিকভাবে লোড হয়েছে।

এই প্রশ্নোত্তরটি দেখুন: মডিউল.কনফিগের অভ্যন্তরে মানের কৌণিক জেএস নির্ভরতা ইনজেকশন

একটি মডিউল কনফিগারেশন এবং রান ব্লকগুলির একটি সংগ্রহ যা বুটস্ট্র্যাপ প্রক্রিয়া চলাকালীন প্রয়োগে প্রয়োগ করা হয়। এর সর্বাধিকতম ফর্মটিতে মডিউলটিতে দুটি ধরণের ব্লক সংগ্রহ রয়েছে:

কনফিগারেশন ব্লকগুলি - সরবরাহকারীর নিবন্ধকরণ এবং কনফিগারেশন পর্বের সময় কার্যকর করা হবে। কনফিগারেশন ব্লকগুলিতে কেবল সরবরাহকারী এবং ধ্রুবককে ইনজেকশন দেওয়া যায়। এটি হ'ল পরিষেবাগুলি সম্পূর্ণরূপে কনফিগার হওয়ার আগে দুর্ঘটনাজনিত প্রতিরোধ রোধ করা prevent


2
আসলে, এই করা যেতে পারে। শীঘ্রই ব্যাখ্যা করে একটি উত্তর সরবরাহ করছি।
ব্রায়ান ভ্যান্ডারবাশ

5

আমি মনে করি না যে আপনি এটি করতে সক্ষম হবেন, তবে আমি একটি পরিষেবা সফলভাবে একটি configব্লকে injুকিয়ে দিয়েছি । (AngularJS v1.0.7)

angular.module('dogmaService', [])
    .factory('dogmaCacheBuster', [
        function() {
            return function(path) {
                return path + '?_=' + Date.now();
            };
        }
    ]);

angular.module('touch', [
        'dogmaForm',
        'dogmaValidate',
        'dogmaPresentation',
        'dogmaController',
        'dogmaService',
    ])
    .config([
        '$routeProvider',
        'dogmaCacheBusterProvider',
        function($routeProvider, cacheBuster) {
            var bust = cacheBuster.$get[0]();

            $routeProvider
                .when('/', {
                    templateUrl: bust('touch/customer'),
                    controller: 'CustomerCtrl'
                })
                .when('/screen2', {
                    templateUrl: bust('touch/screen2'),
                    controller: 'Screen2Ctrl'
                })
                .otherwise({
                    redirectTo: bust('/')
                });
        }
    ]);

angular.module('dogmaController', [])
    .controller('CustomerCtrl', [
        '$scope',
        '$http',
        '$location',
        'dogmaCacheBuster',
        function($scope, $http, $location, cacheBuster) {

            $scope.submit = function() {
                $.ajax({
                    url: cacheBuster('/customers'),  //server script to process data
                    type: 'POST',
                    //Ajax events
                    // Form data
                    data: formData,
                    //Options to tell JQuery not to process data or worry about content-type
                    cache: false,
                    contentType: false,
                    processData: false,
                    success: function() {
                        $location
                            .path('/screen2');

                        $scope.$$phase || $scope.$apply();
                    }
                });
            };
        }
    ]);

সেবা পদ্ধতি নাম dogmaCacheBuster কিন্তু .configআপনি লিখেছি cacheBuster (যা উত্তর যে কোন জায়গায় সংজ্ঞায়িত করা হয় না) এবং dogmaCacheBusterProvider (যা আরও ব্যবহার করা হয় না)। আপনি কি এই বিষয়ে স্পষ্টতা দেবেন?
diEcho

@ প্রো.মিয়ান আমার ধারণা আমি কনফিগার ব্লকে কোনও পরিষেবা সন্নিবেশ করানোর জন্য আমি যে কৌশলটি ব্যবহার করেছি তা প্রদর্শন করেছিলাম তবে এটি কিছুক্ষণ হয়ে গেছে। cacheBusterসংজ্ঞায়িত করা হয়েছে, কনফিগার ফাংশন একটি পরামিতি হিসাবে। শ্রদ্ধার সাথে dogmaCacheBusterProvider, এটি অ্যাঙ্গুলার নামকরণের কনভেনশনগুলির সাথে এমন কিছু চালাক যা আমি বহুদিন ধরে ভুলে গেছি। এটি আপনাকে আরও কাছে পেতে পারে, stackoverflow.com/a/20881705/110010
কিম 3 ই

এই অন্য রেফারেন্স উপর। আমি জানতে পারি যে রেসিডিতে আমরা যা কিছু সংজ্ঞায়িত করি তা সংযোজন সরবরাহকারী.provider() । যদি আমি কোনও কিছু দিয়ে .factory('ServiceName')বা .service('ServiceName')রেসিপি দিয়ে সংজ্ঞায়িত করি এবং .config ব্লকটিতে এর কোনও একটি পদ্ধতি ব্যবহার করতে চাই , সার্ভিসনামপ্রোভাডার হিসাবে প্যারামিটারটি সেট করে তবে এটি আমার অ্যাপ্লিকেশনটিকে থামিয়ে দেয়।
diEcho

5

আপনার কনফিগারেশনে একটি পরিষেবা ইনজেক্ট করতে আপনি ইনজেকশন পরিষেবা ব্যবহার করতে পারেন

app.config (ফাংশন ($ প্রদান) {

    $ সরবরাহ.ডেকোরেটর ("$ ব্যতিক্রমহ্যান্ডার", ফাংশন ($ প্রতিনিধি, $ ইনজেক্টর) {
        রিটার্ন ফাংশন (ব্যতিক্রম, কারণ) {
            var $ rootScope = $ injector.get ("$ রুটস্কোপ");
            $ rootScope.addError ({বার্তা: "ব্যতিক্রম", কারণ: ব্যতিক্রম});
            ate প্রতিনিধি (ব্যতিক্রম, কারণ);
        };
    });

});

সূত্র: http://odetocode.com/blogs/scott/archive/2014/04/21/better-error-handling-in-angularjs.aspx


5

** অ্যাঙ্গুলার ইন্জেক্টর ব্যবহার করে অন্যান্য মডিউলগুলি থেকে স্পষ্টতই পরিষেবার জন্য অনুরোধ করুন **

কিম 3 এর উত্তরটি বিশদভাবে বর্ণনা করার জন্য , আপনি পরিষেবা, কারখানা ইত্যাদি সরবরাহ করতে পারবেন না যতক্ষণ না তারা অন্য মডিউলে অন্তর্ভুক্ত থাকে ...

তবে, আমি নিশ্চিত নই যে *Provider(এটি কোনও পরিষেবাটি প্রক্রিয়াকরণের পরে কৌণিক দ্বারা তৈরি করা হয়েছে, বা কারখানাটি) সর্বদা উপলব্ধ থাকবে (এটি প্রথমে কী লোড হয় তার উপর নির্ভর করে), কৌণিক অলসভাবে মডিউলগুলি লোড করে।

মনে রাখবেন যে আপনি যদি মানগুলি পুনরায় ইনজেকশন করতে চান তবে সেগুলি ধ্রুবক হিসাবে বিবেচনা করা উচিত।

এটি করার আরও একটি সুস্পষ্ট এবং সম্ভবত আরও নির্ভরযোগ্য উপায় + একটি কার্যনির্বাহী প্লঙ্কার

var base = angular.module('myAppBaseModule', [])
base.factory('Foo', function() { 
  console.log("Foo");
  var Foo = function(name) { this.name = name; };
  Foo.prototype.hello = function() {
    return "Hello from factory instance " + this.name;
  }
  return Foo;
})
base.service('serviceFoo', function() {
  this.hello = function() {
    return "Service says hello";
  }
  return this;
});

var app = angular.module('appModule', []);
app.config(function($provide) {
  var base = angular.injector(['myAppBaseModule']);
  $provide.constant('Foo', base.get('Foo'));
  $provide.constant('serviceFoo', base.get('serviceFoo'));
});
app.controller('appCtrl', function($scope, Foo, serviceFoo) {
  $scope.appHello = (new Foo("app")).hello();
  $scope.serviceHello = serviceFoo.hello();
});

2

Config ইনজেক্টর ব্যবহার করে কনফিগারেশনে পরিষেবা পদ্ধতি কল করতে

আমি একই ধরণের সমস্যা পেয়েছি এবং উপরে বর্ণিত $ ইনজেক্টর পরিষেবাটি ব্যবহার করে এটি সমাধান করেছি। আমি সরাসরি পরিষেবাটি ইনজেকশনের চেষ্টা করেছি কিন্তু circ http তে একটি বিজ্ঞপ্তি নির্ভরতার সাথে শেষ করেছি। পরিষেবাটি ত্রুটির সাথে একটি মডেল প্রদর্শন করে এবং আমি ইউআই-বুটস্ট্র্যাপ মডেলটি ব্যবহার করছি যা $ https এর উপরও নির্ভরতা রাখে।

    $httpProvider.interceptors.push(function($injector) {
    return {
        "responseError": function(response) {

            console.log("Error Response status: " + response.status);

            if (response.status === 0) {
                var myService= $injector.get("myService");
                myService.showError("An unexpected error occurred. Please refresh the page.")
            }
        }
    }

ধন্যবাদ যে অনেক সাহায্য করেছে
এরেজ

2

এটি করা খুব সহজ একটি সমাধান

দ্রষ্টব্য : এটি কেবল একটি অ্যাসিনক্রোন কলের জন্য, কারণ পরিষেবাটি কনফিগার প্রয়োগের ক্ষেত্রে আরম্ভ করা হয়নি।

আপনি run()পদ্ধতি ব্যবহার করতে পারেন । উদাহরণ:

  1. আপনার পরিষেবাটিকে "মাই সার্ভিস" বলা হয়
  2. আপনি এটি সরবরাহকারী "মাইপ্রোভাইডার" তে অ্যাসিঙ্ক্রোন কার্যকর করার জন্য ব্যবহার করতে চান

তোমার গোপন সংকেত :

(function () { //To isolate code TO NEVER HAVE A GLOBAL VARIABLE!

    //Store your service into an internal variable
    //It's an internal variable because you have wrapped this code with a (function () { --- })();
    var theServiceToInject = null;

    //Declare your application
    var myApp = angular.module("MyApplication", []);

    //Set configuration
    myApp.config(['MyProvider', function (MyProvider) {
        MyProvider.callMyMethod(function () {
            theServiceToInject.methodOnService();
        });
    }]);

    //When application is initialized inject your service
    myApp.run(['MyService', function (MyService) {
        theServiceToInject = MyService;
    }]);
});

1

ঠিক আছে, আমি এইটির সাথে একটু লড়াই করেছি, তবে আমি আসলে তা করেছি।

কৌণিক পরিবর্তনের কারণে উত্তরগুলি পুরানো হয়েছে কিনা তা আমি জানি না তবে আপনি এটি এইভাবে করতে পারেন:

এটি আপনার পরিষেবা:

.factory('beerRetrievalService', function ($http, $q, $log) {
  return {
    getRandomBeer: function() {
      var deferred = $q.defer();
      var beer = {};

      $http.post('beer-detail', {})
      .then(function(response) {
        beer.beerDetail = response.data;
      },
      function(err) {
        $log.error('Error getting random beer', err);
        deferred.reject({});
      });

      return deferred.promise;
    }
  };
 });

এবং এটি কনফিগারেশন

.when('/beer-detail', {
  templateUrl : '/beer-detail',
  controller  : 'productDetailController',

  resolve: {
    beer: function(beerRetrievalService) {
      return beerRetrievalService.getRandomBeer();
    }
  }
})

0

সহজ রাস্তা: $injector = angular.element(document.body).injector()

তারপরে এটি চালাতে invoke()বা ব্যবহার করুনget()


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