একটি কৌনিক জেএস পরিষেবাতে বর্তমান সুযোগ পাস করা


106

$scopeঅ্যাংুলারজেএস সার্ভিসে "কারেন্ট" পাস করা কি সঠিক ?

আমি এমন পরিস্থিতিতে আছি যেখানে আমি $ পরিষেবাটি জেনেছিলাম এটি কেবলমাত্র একজন নিয়ামক দ্বারা গ্রহণ করা হয় এবং আমি সেবার নিজের পদ্ধতিতে নিয়ামকের সুযোগ সম্পর্কে একটি উল্লেখ পেতে চাই।

এটি কি দার্শনিকভাবে সঠিক?

অথবা আমি $ রুটস্কোপে ইভেন্টগুলি সম্প্রচার করে তারপরে আমার নিয়ামককে সেগুলি শোনার জন্য আরও ভাল করব?


1
আপনি সম্ভবত আমাদের কী করার চেষ্টা করছেন তা আমাদের আরও নির্দিষ্ট করে বলতে পারেন? সম্ভবত পরিষেবাটিতে সুযোগ বাড়ানো কি মোটেই প্রয়োজন হয় না?
গণরাজ

ঠিক আছে, এটা এত কঠিন নয়। সহজভাবে, আমি প্রয়োজনে $scopeবৈশিষ্ট্যগুলি অ্যাক্সেস করতে এবং কল করতে সক্ষম হতে চাই $scope.$apply
এসসি

অধিকন্তু, বলুন যে আমি changes পরিসেবা থেকে $ পরিসেবা থেকে আসা পরিবর্তনগুলি প্রয়োগ করতে চাই। আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
এসসি

8
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি put স্কোপ বৈশিষ্ট্যগুলি নিজের পরিষেবাতে অ্যাক্সেস করতে চান (সেগুলি কন্ট্রোলারে রাখার পরিবর্তে) put পরিষেবাদি নিয়ন্ত্রকদের তুলনায় মডেল / ডেটা সঞ্চয় করার জন্য ভাল জায়গা।
21/13 এ রাজকোক

@ মারকরাজাকক আমি এই বিষয়টিও বোঝার চেষ্টা করছি। বর্তমানে আমি কেবল একটি পরিষেবা কল করছি এবং পরিবেশন করা ডেটা নিয়ন্ত্রণকারীর সাথে সংযুক্ত করছি $scope... কীভাবে নিয়ন্ত্রক সরাসরি পরিষেবাটিতে ডেটা অ্যাক্সেস করতে এবং এটি না করে এটিকে দর্শনে দেবেন?
drjimmie1976

উত্তর:


67

যখন কিছু অ্যাসিঙ্ক হয় তখন নিয়ামককে জানাতে, কৌনিক প্রতিশ্রুতি ব্যবহার করুন ।

প্ররোচিত করার জন্য $apply, আপনার সুযোগের দরকার নেই, আপনি কল করতে পারেন $rootScope.$apply, কারণ এটি কোনও নির্দিষ্ট সুযোগে বা মূলকে ডেকে কোনও পার্থক্য নেই।

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


আমি মনে করি এটিই উত্তর যা আমার অ্যাংুলার জেএস শুরুর সন্দেহগুলিকে আরও ভালভাবে সমাধান করে।
এসসি

@ কায়ো কুনহা আপনি কীভাবে আরও প্রসারিত করতে পারেন কেন একটি সুযোগ পাস করা ভাল ধারণা নয়? আমার ঠিক এই সমস্যাটি হচ্ছে, আমি $scopeএকটি অ্যাসিঙ্ক executeSql()ফাংশন ব্যবহার করে কোনও পরিষেবাদির কলের মাধ্যমে কিছু স্টাফ যুক্ত করতে চাই । 3 টি অপশনে (1) সন্ধান করে অ্যাসিঙ্ক ফাংশনে একটি কলব্যাক ব্যবহার করুন, তারপরে কল করুন $scope.$apply... এটি কাজ করে তবে কুৎসিত (2) $scopeঅ্যাসিঙ্ক ফাংশনে চলে আসে, তারপরে কল করুন theScope.$apply()... এটিও কাজ করে (3) একটি প্রতিশ্রুতি ব্যবহার করে। .. এখনও চেষ্টা করে দেখেনি। কেন একটি প্রতিশ্রুতি সেরা উপায়? ধন্যবাদ!
drjimmie1976

15

আমি বলব যদি আপনার কার্যকারিতা কেবল কোনও নিয়ামকের সাথে নির্দিষ্ট হয় তবে আপনার কোনও পরিষেবার প্রয়োজন নেই need

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

ডক্স এটিই বলে

সেবা

কৌণিক পরিষেবাগুলি সিঙ্গেলন যা ওয়েব অ্যাপ্লিকেশনগুলিতে সাধারণ নির্দিষ্ট কাজগুলি সম্পাদন করে

নিয়ামক

কৌণিক ক্ষেত্রে, একটি কন্ট্রোলার একটি জাভাস্ক্রিপ্ট ফাংশন (প্রকার / শ্রেণি) যা মূল স্কোপটি বাদ দিয়ে কৌনিক স্কোপের উদাহরণ বাড়ানোর জন্য ব্যবহৃত হয়।

PS: এগুলি ছাড়াও যদি আপনার হজম করা দরকার হয় তবে আপনি আপনার পরিষেবার মধ্যে within রুটস্কোপও ইনজেকশন করতে পারেন।


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

যাইহোক কল করার বিষয়ে $applyবা $digest$ রুটস্কোপ সম্পর্কে স্পষ্টতা আমার কাছে সম্পূর্ণ বোঝা sense
এসসি

1
আমি এখনও এটি পরীক্ষার জন্য কোনও পরিষেবাতে আলাদা রাখব।
ব্লুহল্লু

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

9

হ্যাঁ. আপনি যখন এটি আরম্ভ করবেন তখন আপনি $ সুযোগটি পরিষেবাতে পাস করতে পারেন। সার্ভিস কনস্ট্রাক্টরে আপনি এই জাতীয় কিছুতে সুযোগটি অর্পণ করতে পারেন __স্কোপ করুন এবং তারপরে পরিষেবার মধ্যে সুযোগটি রেফারেন্স করুন!

angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {

    $scope.someVar = 4;

    $scope.blahService = new blahService($scope);

});

angular.module('blah').factory('blahService', function() {

    //constructor
    function blahService(scope) {
        this._scope = scope;

        this._someFunction()
    }

    //wherever you'd reference the scope
    blahService.prototype._someFunction = function() {

        this._scope['someVar'] = 5;

    }

    return blahService;

});

1
+1, তবে আমি প্রতিটি নিয়ামককে স্বয়ংক্রিয়ভাবে জানার একটি উপায় দেখতে চাই $scopeযখনই প্রদত্ত নিয়ামক পরিষেবাটি ইনজেক্ট করে - যাতে সেবার কোনও পদ্ধতিতে কল না দেওয়া এবং ম্যানুয়ালি এতে প্রবেশ $scopeকরতে হয়।
কোডি

2
@ কোডি আমি প্রস্তাব দিচ্ছি না যেহেতু এটি নির্ভরতা ইনজেকশনের সাথে বিরোধী
Coldstar

রাজি, আমাকে শুটিংয়ের জন্য +1! সম্ভবত কসাই ডিআইপিও - আমি বলব, অপ্রয়োজনীয় হওয়ার ঝুঁকিতে।
কোডি

আপনি এখানে কারখানার সাথে পরিষেবার মিশ্রণ করছেন। এই সমাধানটি একটি কারখানা ব্যবহার করে, যা কোনও পরিষেবার থেকে পৃথক হয়। মূল পার্থক্য হ'ল কোনও পরিষেবা কোনও (সিঙ্গলটন) বস্তুটি দেয়। অন্যদিকে কারখানা কোনও ফাংশন দেয়, যা তাত্ক্ষণিকভাবে চালু করা যেতে পারে ( new MyFunction())। প্রশ্নটি একটি পরিষেবা সম্পর্কিত ছিল, যেখানে কল newকরা কোনও বিকল্প নয়।
কর্ভপালো

পছন্দ করুন কাউন্টার পয়েন্ট হিসাবে আমি বিশ্বাস করি যে কৌণিক পরিষেবাগুলি কোনও কারখানা, পরিষেবা এবং সরবরাহকারীর (এনজি-ওয়াট) বোঝায়?
ব্যবহারকারী 12121234

6

আমি ব্যক্তিগতভাবে বিশ্বাস করি যে $scopeকোনও পরিষেবাদিতে পাস করা একটি খারাপ ধারণা , কারণ এটি একটি কিন্ডার বিজ্ঞপ্তি রেফারেন্স তৈরি করে: নিয়ামক পরিষেবাটির উপর নির্ভর করে এবং পরিষেবাটি নিয়ামকের সুযোগের উপর নির্ভর করে।

সম্পর্কের দিক থেকে বিভ্রান্তির শীর্ষে, এই জাতীয় জিনিসগুলি আবর্জনা সংগ্রহকারীর পথে শেষ হয়।

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

উদাহরণস্বরূপ, যদি পরিষেবাটি অ্যারে থেকে উপাদানগুলিকে ধাক্কা দেওয়ার এবং পপ করার কথা মনে করে তবে errorsআমার কোডটি হবে:

var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);

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

আমি কখনই সম্প্রচার ব্যবহার করতে চাই না, $apply এবং / বা অনুরূপ জিনিস , কারণ খুব ভাল ওও অনুশীলন সর্বদা অ্যাঙ্গুলার-ম্যাজিককে ট্রাম্প করবে।


1
এই $scope.errors = []; $scope.myService = new MyService($scope.errors);
কোডটির সাথে এইটির

@ সোলডেপ্লাটা সাকেটোস - হ্যাঁ, তা হয়। errorsস্বাধীনভাবে বসবাস $scope। এটি এই উত্তর পুরো পয়েন্ট। আমি পাঠ্য লিঙ্কটিতে সরবরাহ করা লিঙ্ক চেক করুন। চিয়ার্স।
মার্কো ফাউস্টিনেল্লি

1
যদি আমি আপনার কোডটি সঠিকভাবে বুঝতে পারি তবে $scope.errorsএটি নির্দেশ করছে var errorsএবং ভেরিয়েবল ত্রুটিগুলি আমার কাছে অপ্রয়োজনীয় দেখায়, এটি কেবল অন্য পয়েন্টার হিসাবে। এক একই অবস্থা আমি এবং এটি blatantly অপ্রয়োজনীয় যে মনে করতে পারেন কোড এই টুকরা হল: const errors = errors2 = errors3 = []; $scope.errors = errors;। আপনি কি সম্মত হন যে কেবলমাত্র কোডের টুকরা আপনি সরবরাহ করেছেন তা মনে var errors = []হয় এটি অনর্থক?
সলডেপ্লাটা সাকেটোস

না এইটা না. আমি নিজেকে কথার দ্বারা পুনরাবৃত্তি করি: errorsস্বাধীনভাবে বাঁচি $scope। আপনাকে একটি ডোমেন অবজেক্ট কী তা বোঝার প্রয়োজন যেমন একটি varঅ্যাসাইনমেন্ট কী। আমার দেওয়া লিঙ্কটি যদি পর্যাপ্ত না হয় তবে প্রচুর পরিমাণে অন্যান্য উপাদান উপলব্ধ।
মার্কো ফাউস্টিনেলি

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