অ্যাঙ্গুলারজেএস-এ নন-সিঙ্গলটন পরিষেবাদি


90

অ্যাঙ্গুলারজেএস তার ডকুমেন্টেশনে স্পষ্টভাবে জানিয়েছে যে পরিষেবাগুলি সিলেটলেটস:

AngularJS services are singletons

পাল্টা, module.factoryএকটি একক উদাহরণও দেয়।

নন-সিঙ্গলটন পরিষেবাদিগুলির প্রচুর ব্যবহারের কেস পাওয়া যায়, কোনও পরিষেবার উদাহরণগুলি ফিরিয়ে আনার জন্য কারখানার পদ্ধতিটি কার্যকর করার সর্বোত্তম উপায় কী, যাতে প্রতিবার ExampleServiceনির্ভরতা ঘোষণা করা হয়, এটি কোনও আলাদা উদাহরণ দ্বারা সন্তুষ্ট হয় ExampleService?


4
ধরে নিচ্ছি আপনি এই কাজটি করতে পারতেন, তাই না? অন্যান্য কৌণিক বিকাশকারীরা কোনও নির্ভরতা-ইনজেকশনের কারখানাটি সমস্ত সময় নতুন দৃষ্টান্ত ফিরে আসবে বলে আশা করবেন না।
মার্ক রাজকক

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

উত্তর:


44

আমি মনে করি না যে আমাদের কখনই কোনও কারখানার একটি newসক্ষম ফাংশন ফিরিয়ে নেওয়া উচিত কারণ এটি নির্ভরতা ইনজেকশনটি ভেঙে ফেলা শুরু করে এবং গ্রন্থাগারটি বিশ্রীভাবে আচরণ করবে, বিশেষত তৃতীয় পক্ষের জন্য। সংক্ষেপে, আমি নিশ্চিত নন-সিঙ্গলটন পরিষেবাগুলির জন্য কোনও বৈধ ব্যবহারের মামলা আছে।

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

.controller( 'MainCtrl', function ( $scope, widgetService ) {
  $scope.onSearchFormSubmission = function () {
    widgetService.findById( $scope.searchById ).then(function ( widget ) {
      // this is a returned object, complete with all the getter/setters
      $scope.widget = widget;
    });
  };

  $scope.onWidgetSave = function () {
    // this method persists the widget object
    $scope.widget.$save();
  };
});

আইডি দ্বারা কোনও উইজেট সন্ধান করার এবং এটি রেকর্ডে করা পরিবর্তনগুলি সংরক্ষণ করতে সক্ষম হবার জন্য এটি কেবলমাত্র সিউডো কোড।

পরিষেবার জন্য এখানে কয়েকটি সিউডো কোড রয়েছে:

.factory( 'widgetService', function ( $http ) {

  function Widget( json ) {
    angular.extend( this, json );
  }

  Widget.prototype = {
    $save: function () {
      // TODO: strip irrelevant fields
      var scrubbedObject = //...
      return $http.put( '/widgets/'+this.id, scrubbedObject );
    }
  };

  function getWidgetById ( id ) {
    return $http( '/widgets/'+id ).then(function ( json ) {
      return new Widget( json );
    });
  }


  // the public widget API
  return {
    // ...
    findById: getWidgetById
    // ...
  };
});

যদিও এই উদাহরণে অন্তর্ভুক্ত করা হয়নি, এই ধরণের নমনীয় পরিষেবাগুলি সহজেই রাষ্ট্র পরিচালনা করতে পারে।


আমার এখনই সময় নেই, তবে এটি যদি সহায়ক হয় তবে আমি পরে একটি সাধারণ প্লাঙ্কারকে প্রদর্শন করতে পারি can


এটি সত্যিই আকর্ষণীয়। একটি উদাহরণ সত্যই সহায়ক হবে। অনেক ধন্যবাদ.
আনডিস্ট্রাকশন

এটা মজার. দেখে মনে হচ্ছে এটি কোনও কৌণিকের মতোই কাজ করবে $resource
জোনাথন পলম্বো

@ জোনাথান পলম্বো আপনি ঠিক বলেছেন - এনজিআরসোর্সের সাথে খুব মিল similar আসলে, পেডার এবং আমি এই প্রশ্নটি স্পর্শকাতরভাবে অন্য একটি প্রশ্নে শুরু করেছি যেখানে আমি এনজিআরসোর্সের অনুরূপ একটি পদ্ধতির গ্রহণের পরামর্শ দিয়েছিলাম। এটি এত সহজ উদাহরণের জন্য, ম্যানুয়ালি এটি করার কোনও সুবিধা নেই - এনজিআরসোর্স বা রিস্টাঙ্গুলার সাঁতার কাটতে কাজ করবে। তবে ক্ষেত্রেগুলি সম্পূর্ণরূপে আদর্শ নয়, এই পদ্ধতির অর্থটি কার্যকর হয়।
জোশ ডেভিড মিলার

4
@ পেডার দুঃখিত, আমি এই সম্পর্কে ভুলে গেছি। এখানে একটি অতি-সহজ ডেমো: plnkr.co/edit/Xh6pzd4HDlLRqITWuz8X
জোশ ডেভিড মিলার

15
@ জোশডাভিডমিলার আপনি কী উল্লেখ করতে পারলেন যে কেন / কীভাবে "নির্ভরতা ইনজেকশনটি ভেঙে দেওয়া হবে এবং [কেন / কী] পাঠাগারটি বিশ্রীভাবে আচরণ করবে"?
ওকিগান

77

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

var ExampleApplication = angular.module('ExampleApplication', []);


ExampleApplication.factory('InstancedService', function(){

    function Instance(name, type){
        this.name = name;
        this.type = type;
    }

    return {
        Instance: Instance
    }

});


ExampleApplication.controller('InstanceController', function($scope, InstancedService){
       var instanceA = new InstancedService.Instance('A','string'),
           instanceB = new InstancedService.Instance('B','object');

           console.log(angular.equals(instanceA, instanceB));

});

জেএসফিডাল

আপডেট হয়েছে

অ সিঙ্গলটন পরিষেবাগুলির জন্য নিম্নলিখিত অনুরোধটি বিবেচনা করুন । এতে ব্রায়ান ফোর্ড নোট করেছেন:

সমস্ত পরিষেবাদি সিঙ্গেলন এই ধারণাটি আপনাকে সিঙ্গলটন কারখানাগুলি লিখতে বাধা দেয় না যা নতুন নতুন অবজেক্টগুলিকে ইনস্ট্যান্ট করতে পারে।

এবং কারখানাগুলি থেকে ফিরে আসা উদাহরণগুলি:

myApp.factory('myService', function () {
  var MyThing = function () {};
  MyThing.prototype.foo = function () {};
  return {
    getInstance: function () {
      return new MyThing();
    }
  };
});

আমি এটিকে যুক্তি দিয়ে বলব যে newআপনার নিয়ামকটিতে আপনাকে কীওয়ার্ডটি ব্যবহার করতে হবে না তার কারণে তার উদাহরণটি সর্বোত্তম । এটি getInstanceপরিষেবা পদ্ধতির মধ্যে আবদ্ধ হয় ।


উদাহরণের জন্য ধন্যবাদ। সুতরাং ডিআই কনটেইনার একটি উদাহরণ সহ নির্ভরতা সন্তুষ্ট করার উপায় নেই। একমাত্র উপায় হ'ল এটির সরবরাহকারীর সাথে নির্ভরতা সন্তুষ্ট করা যা পরে উদাহরণটি তৈরি করতে ব্যবহার করা যেতে পারে?
আনডিস্ট্রাকশন

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

+1 খুব সাহায্য। আমি এই পদ্ধতির সাথে ngInfiniteScrollএবং একটি কাস্টম অনুসন্ধান পরিষেবা ব্যবহার করছি যাতে আমি ক্লিকের ইভেন্ট না হওয়া পর্যন্ত প্রাথমিককরণে বিলম্ব করতে পারি। প্রথম সমাধানের জেএসফিডেল
GFoley83

4
নতুন অপারেটরটি কেন খারাপ ব্যবহার করছে? আমি মনে করি যদি আপনার লক্ষ্যটি একটি নন সিঙ্গলটন হয় তবে এটি ব্যবহার newকরা ঘোষিত এবং কী কী পরিষেবাগুলি সিলেটলেট এবং কী কী তা তা এখনই বলা সহজ। যদি কোনও বস্তু নতুন করা হয় তার উপর ভিত্তি করে।
j_walker_dev

মনে হচ্ছে এটির উত্তর হওয়া উচিত কারণ এটি প্রশ্নটি যা চেয়েছিল তা সরবরাহ করে - বিশেষত "আপডেটেড" পরিশিষ্ট।
lukkea

20

আরেকটি উপায় হ'ল পরিষেবা অবজেক্টের সাথে অনুলিপি করা angular.extend()

app.factory('Person', function(){
  return {
    greet: function() { return "Hello, I'm " + this.name; },
    copy: function(name) { return angular.extend({name: name}, this); }
  };
});

এবং তারপরে, উদাহরণস্বরূপ, আপনার নিয়ামকটিতে

app.controller('MainCtrl', function ($scope, Person) {
  michael = Person.copy('Michael');
  peter = Person.copy('Peter');

  michael.greet(); // Hello I'm Michael
  peter.greet(); // Hello I'm Peter
});

এখানে একটি নিমজ্জন


সত্যিই ঝরঝরে! আপনি কি এই কৌশলটির পিছনে কোনও বিপদ সম্পর্কে জানেন? সর্বোপরি, এটি কেবল কৌণিক an একটি বিষয়কে বাড়িয়ে তুলছে, সুতরাং আমার ধারণা আমাদের ভাল হওয়া উচিত। তবুও, কোনও পরিষেবার কয়েকটি ডজন কপি তৈরি করা কিছুটা ভয় দেখানোর মতো শোনায়।
Vucalur

9

আমি জানি এই পোস্টটির ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে আমি এখনও মনে করি এমন কিছু বৈধ পরিস্থিতি থাকবে যা আপনার অ-সিঙ্গলটন পরিষেবা থাকা দরকার। আসুন আমরা এখানে কিছু পুনরায় ব্যবহারযোগ্য ব্যবসায়ের যুক্তি রয়েছে যা বেশ কয়েকটি নিয়ামকের মধ্যে ভাগ করা যায়। এই দৃশ্যে লজিক রাখার সবচেয়ে ভাল জায়গাটি একটি পরিষেবা হবে, তবে আমাদের যদি পুনরায় ব্যবহারযোগ্য যুক্তিতে কিছু রাষ্ট্র রাখা প্রয়োজন তবে কী হবে? তারপরে আমাদের নন-সিঙ্গলটন পরিষেবা প্রয়োজন যাতে অ্যাপে বিভিন্ন নিয়ামককে ভাগ করে নেওয়া যায়। এইভাবে আমি এই পরিষেবাগুলি প্রয়োগ করব:

angular.module('app', [])
    .factory('nonSingletonService', function(){

        var instance = function (name, type){
            this.name = name;
            this.type = type;
            return this;
        }

        return instance;
    })
    .controller('myController', ['$scope', 'nonSingletonService', function($scope, nonSingletonService){
       var instanceA = new nonSingletonService('A','string');
       var instanceB = new nonSingletonService('B','object');

       console.log(angular.equals(instanceA, instanceB));

    }]);

এটি জোনাথন পালাম্বোর জবাবের সাথে খুব মিল, জোনাথন তার "আপডেটেড" পরিশিষ্টের সাথে সমস্ত কিছু আবদ্ধ করে না।
lukkea

4
আপনি কি বলছেন যে একটি অ সিঙ্গলটন পরিষেবা অবিচ্ছিন্ন থাকবে। এবং রাষ্ট্র রাখা উচিত, কিন্ডা অন্য চারপাশের মত মনে হয়।
ইরান otzap

2

এখানে আমার নন সিঙ্গলটন পরিষেবাদির উদাহরণ রয়েছে, এটি কাজ করছে এমন একটি ORM থেকে। উদাহরণস্বরূপ আমি একটি বেস মডেল (মডেলফ্যাক্টরি) দেখি যা আমি পরিষেবাগুলি ('ব্যবহারকারীগণ', 'নথিপত্র') উত্তরাধিকারী এবং সম্ভাব্য প্রসারিত করতে চাই।

আমার ওআরএম মডেলফ্যাক্টরিতে অতিরিক্ত কার্যকারিতা সরবরাহ করার জন্য অন্যান্য পরিষেবাগুলিকে সংযুক্ত করে (ক্যোয়ারী, অধ্যবসায়, স্কিমা ম্যাপিং) যা মডিউল সিস্টেমটি ব্যবহার করে স্যান্ডবক্সযুক্ত।

উদাহরণস্বরূপ ব্যবহারকারী এবং দস্তাবেজ পরিষেবা উভয়ের একই কার্যকারিতা রয়েছে তবে তাদের নিজস্ব স্বাধীন স্কোপ রয়েছে।

/*
    A class which which we want to have multiple instances of, 
    it has two attrs schema, and classname
 */
var ModelFactory;

ModelFactory = function($injector) {
  this.schema = {};
  this.className = "";
};

Model.prototype.klass = function() {
  return {
    className: this.className,
    schema: this.schema
  };
};

Model.prototype.register = function(className, schema) {
  this.className = className;
  this.schema = schema;
};

angular.module('model', []).factory('ModelFactory', [
  '$injector', function($injector) {
    return function() {
      return $injector.instantiate(ModelFactory);
    };
  }
]);


/*
    Creating multiple instances of ModelFactory
 */

angular.module('models', []).service('userService', [
  'ModelFactory', function(modelFactory) {
    var instance;
    instance = new modelFactory();
    instance.register("User", {
      name: 'String',
      username: 'String',
      password: 'String',
      email: 'String'
    });
    return instance;
  }
]).service('documentService', [
  'ModelFactory', function(modelFactory) {
    var instance;
    instance = new modelFactory();
    instance.register("Document", {
      name: 'String',
      format: 'String',
      fileSize: 'String'
    });
    return instance;
  }
]);


/*
    Example Usage
 */

angular.module('controllers', []).controller('exampleController', [
  '$scope', 'userService', 'documentService', function($scope, userService, documentService) {
    userService.klass();

    /*
        returns 
        {
            className: "User"
            schema: {
                name : 'String'
                username : 'String'
                password: 'String'
                email: 'String'     
            }
        }
     */
    return documentService.klass();

    /*
        returns 
        {
            className: "User"
            schema: {
                name : 'String'
                format : 'String'
                formatileSize: 'String' 
            }
        }
     */
  }
]);

1

কৌণিক শুধুমাত্র একটি সিঙ্গলটন পরিষেবা / কারখানার বিকল্প দেয়। এর চারপাশের একটি উপায় হল একটি কারখানা পরিষেবা যা আপনার নিয়ামক বা অন্যান্য গ্রাহক দৃষ্টান্তগুলিতে আপনার জন্য একটি নতুন উদাহরণ তৈরি করবে। কেবল ইনজেকশন দেওয়া জিনিসটি ক্লাস যা নতুন দৃষ্টান্ত তৈরি করে। অন্যান্য নির্ভরতা ইনজেকশনের জন্য বা ব্যবহারকারীর নির্দিষ্টকরণে আপনার নতুন বস্তুর সূচনা করার জন্য এটি পরিষেবা (পরিষেবা বা কনফিগারেশন যোগ করা) ভাল জায়গা

namespace admin.factories {
  'use strict';

  export interface IModelFactory {
    build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel;
  }

  class ModelFactory implements IModelFactory {
 // any injection of services can happen here on the factory constructor...
 // I didnt implement a constructor but you can have it contain a $log for example and save the injection from the build funtion.

    build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel {
      return new Model($log, connection, collection, service);
    }
  }

  export interface IModel {
    // query(connection: string, collection: string): ng.IPromise<any>;
  }

  class Model implements IModel {

    constructor(
      private $log: ng.ILogService,
      private connection: string,
      private collection: string,
      service: admin.services.ICollectionService) {
    };

  }

  angular.module('admin')
    .service('admin.services.ModelFactory', ModelFactory);

}

তারপরে আপনার গ্রাহক দৃষ্টান্তে আপনার কারখানার পরিষেবা প্রয়োজন এবং যখন প্রয়োজন হবে তখন একটি নতুন উদাহরণ পেতে কারখানার বিল্ড পদ্ধতিতে কল করুন

  class CollectionController  {
    public model: admin.factories.IModel;

    static $inject = ['$log', '$routeParams', 'admin.services.Collection', 'admin.services.ModelFactory'];
    constructor(
      private $log: ng.ILogService,
      $routeParams: ICollectionParams,
      private service: admin.services.ICollectionService,
      factory: admin.factories.IModelFactory) {

      this.connection = $routeParams.connection;
      this.collection = $routeParams.collection;

      this.model = factory.build(this.$log, this.connection, this.collection, this.service);
    }

  }

আপনি দেখতে পাচ্ছেন যে এটি কারখানার পদক্ষেপে উপলভ্য নয় এমন কিছু নির্দিষ্ট পরিষেবা ইনজেকশনের জন্য বৈপরীত্য সরবরাহ করে। সমস্ত মডেল দৃষ্টান্ত ব্যবহার করার জন্য আপনি কারখানার দৃষ্টান্তে সর্বদা ইনজেকশনটি পেতে পারেন।

দ্রষ্টব্য আমাকে কিছু কোড সরিয়ে ফেলতে হয়েছিল যাতে আমি কিছু প্রসঙ্গ ত্রুটি করতে পারি ... আপনার যদি এমন কোনও কোডের নমুনার প্রয়োজন হয় যা আমাকে জানাতে পারে।

আমি বিশ্বাস করি যে এনজি 2 আপনার ডিওমে সঠিক জায়গায় আপনার পরিষেবার একটি নতুন উদাহরণ ইনজেকশনের বিকল্প পাবে যাতে আপনার নিজের কারখানার বাস্তবায়ন তৈরি করতে হবে না। অপেক্ষা করতে হবে এবং দেখতে হবে :)


চমৎকার পন্থা - আমি দেখতে চাই $ সার্ভিস ফ্যাক্টরি একটি এনপিএম প্যাকেজ হিসাবে। আপনি যদি পছন্দ করেন তবে আমি এটি তৈরি করতে এবং আপনাকে একটি সহায়ক হিসাবে যুক্ত করতে পারি?
IamStalker

1

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

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

আমি বিশ্বাস করি যে কোনও সমাধান কোনও পরিষেবাটির মধ্যে এমন একটি বিষয় সরবরাহ করছে যা আপনি একটি নতুন উদাহরণ তৈরি করতে পারেন এবং সেট করতে পারেন। তবে, কেবল স্পষ্ট করে বলতে গেলে, পরিষেবার একক উদাহরণটি গুরুত্বপূর্ণ কারণ একটি নিয়ামক তৈরি হতে পারে এবং বহুবার ধ্বংস হতে পারে তবে পরিষেবাগুলিকে অধ্যবসায়ের প্রয়োজন। আপনি যা সন্ধান করছেন তা কৌণিকের মধ্যে সরাসরি পদ্ধতি নাও হতে পারে, তবে একটি অবজেক্ট প্যাটার্ন যা আপনি নিজের পরিষেবার ভিতরে পরিচালনা করতে পারেন।

উদাহরণ হিসাবে, আমি একটি রিসেট বোতাম তৈরি করেছি । (এটি পরীক্ষা করা হয় না, এটি কোনও পরিষেবার মধ্যে নতুন অবজেক্ট তৈরির জন্য এটি ব্যবহারের ক্ষেত্রে কেবলমাত্র দ্রুত ধারণা idea

app.controller("PaymentController", ['$scope','PaymentService',function($scope, PaymentService) {
    $scope.utility = {
        reset: PaymentService.payment.reset()
    };
}]);
app.factory("PaymentService", ['$http', function ($http) {
    var paymentURL = "https://www.paymentserviceprovider.com/servicename/token/"
    function PaymentObject(){
        // this.user = new User();
        /** Credit Card*/
        // this.paymentMethod = ""; 
        //...
    }
    var payment = {
        options: ["Cash", "Check", "Existing Credit Card", "New Credit Card"],
        paymentMethod: new PaymentObject(),
        getService: function(success, fail){
            var request = $http({
                    method: "get",
                    url: paymentURL
                }
            );
            return ( request.then(success, fail) );

        }
        //...
    }
    return {
        payment: {
            reset: function(){
                payment.paymentMethod = new PaymentObject();
            },
            request: function(success, fail){
                return payment.getService(success, fail)
            }
        }
    }
}]);

0

সমস্যাটির আরও একটি পদ্ধতি যা আমি যথেষ্ট সন্তুষ্ট ছিলাম, বিশেষত যখন উন্নততর অপ্টিমাইজেশানগুলি সক্ষম করে ক্লোজার কম্পাইলারের সাথে সংমিশ্রণে ব্যবহৃত হয়েছিল:

var MyFactory = function(arg1, arg2) {
    this.arg1 = arg1;
    this.arg2 = arg2;
};

MyFactory.prototype.foo = function() {
    console.log(this.arg1, this.arg2);

    // You have static access to other injected services/factories.
    console.log(MyFactory.OtherService1.foo());
    console.log(MyFactory.OtherService2.foo());
};

MyFactory.factory = function(OtherService1, OtherService2) {
    MyFactory.OtherService1_ = OtherService1;
    MyFactory.OtherService2_ = OtherService2;
    return MyFactory;
};

MyFactory.create = function(arg1, arg2) {
    return new MyFactory(arg1, arg2);
};

// Using MyFactory.
MyCtrl = function(MyFactory) {
    var instance = MyFactory.create('bar1', 'bar2');
    instance.foo();

    // Outputs "bar1", "bar2" to console, plus whatever static services do.
};

angular.module('app', [])
    .factory('MyFactory', MyFactory)
    .controller('MyCtrl', MyCtrl);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.