$scope
আপনি কন্ট্রোলার মধ্যে ইনজেকশনের হচ্ছে দেখুন কিছু সার্ভিস (ইঞ্জেকশনভিত্তিক কাপড় বাকি মত) নয়, কিন্তু একটি ব্যাপ্তি অবজেক্ট। অনেক স্কোপ অবজেক্ট তৈরি করা যায় (সাধারণত অভিভাবকের সুযোগ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়)। সমস্ত $rootScope
স্কোপের মূল হ'ল এবং আপনি যে $new()
কোনও সুযোগের পদ্ধতি (সহ $rootScope
) ব্যবহার করে একটি নতুন শিশু-সুযোগ তৈরি করতে পারেন ।
একটি ব্যাপ্তির উদ্দেশ্য আপনার অ্যাপ্লিকেশনটির উপস্থাপনা এবং ব্যবসায়িক যুক্তি "একসাথে আটকানো"। $scope
কোনও পরিষেবাতে পাস করার পক্ষে এটি খুব বেশি অর্থবোধ করে না ।
পরিষেবাগুলি হ'ল সিঙ্গলটন অবজেক্টস (অন্যান্য জিনিসের মধ্যে) ডেটা ভাগ করার জন্য ব্যবহৃত হয় (উদাহরণস্বরূপ বেশ কয়েকটি নিয়ন্ত্রণকারীদের মধ্যে) এবং সাধারণত কোডের পুনরায় ব্যবহারযোগ্য টুকরাগুলি encapsulate (যেহেতু তারা ইনজেকশনের মাধ্যমে আপনার অ্যাপ্লিকেশানের যে কোনও অংশে তাদের "পরিষেবাদি" সরবরাহ করতে পারে যা তাদের প্রয়োজন: নিয়ন্ত্রক, নির্দেশাবলী, ফিল্টার, অন্যান্য পরিষেবাদি ইত্যাদি)।
আমি নিশ্চিত, বিভিন্ন পদ্ধতি আপনার পক্ষে কাজ করবে।
এটি StudentService
হ'ল : যেহেতু শিক্ষার্থীদের ডেটা নিয়ে কাজ করার দায়িত্বে রয়েছেন, তাই আপনার StudentService
কাছে শিক্ষার্থীদের একটি অ্যারে রাখা থাকতে পারে এবং যারাই আগ্রহী (যেমন আপনার $scope
) তার সাথে এটি "ভাগ" করতে দিন । এটি আরও দৃ sense়তর করে তোলে, যদি সেখানে অন্যান্য মতামত / নিয়ন্ত্রণকারী / ফিল্টার / পরিষেবাদিগুলির সেই তথ্যে অ্যাক্সেস থাকা দরকার (যদি এখনই কিছু না থাকে তবে তারা শীঘ্রই পপিং শুরু করলে অবাক হবেন না)।
প্রতিবার নতুন শিক্ষার্থী যুক্ত হওয়ার সাথে সাথে (পরিষেবাদির save()
পদ্ধতিটি ব্যবহার করে ), সেবার নিজস্ব শিক্ষার্থীদের আরে আপডেট করা হবে এবং অ্যারে ভাগ করে নেওয়া প্রতিটি বস্তু ভাগ করে নেওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে আপডেট হবে।
উপরে বর্ণিত পদ্ধতির উপর ভিত্তি করে, আপনার কোডটি দেখতে এরকম হতে পারে:
angular.
module('cfd', []).
factory('StudentService', ['$http', '$q', function ($http, $q) {
var path = 'data/people/students.json';
var students = [];
// In the real app, instead of just updating the students array
// (which will be probably already done from the controller)
// this method should send the student data to the server and
// wait for a response.
// This method returns a promise to emulate what would happen
// when actually communicating with the server.
var save = function (student) {
if (student.id === null) {
students.push(student);
} else {
for (var i = 0; i < students.length; i++) {
if (students[i].id === student.id) {
students[i] = student;
break;
}
}
}
return $q.resolve(student);
};
// Populate the students array with students from the server.
$http.get(path).then(function (response) {
response.data.forEach(function (student) {
students.push(student);
});
});
return {
students: students,
save: save
};
}]).
controller('someCtrl', ['$scope', 'StudentService',
function ($scope, StudentService) {
$scope.students = StudentService.students;
$scope.saveStudent = function (student) {
// Do some $scope-specific stuff...
// Do the actual saving using the StudentService.
// Once the operation is completed, the $scope's `students`
// array will be automatically updated, since it references
// the StudentService's `students` array.
StudentService.save(student).then(function () {
// Do some more $scope-specific stuff,
// e.g. show a notification.
}, function (err) {
// Handle the error.
});
};
}
]);
এই পদ্ধতির ব্যবহার করার সময় আপনার একটি জিনিস সম্পর্কে যত্নবান হওয়া উচিত তা হ'ল কখনও পরিষেবাটির অ্যারে পুনরায় নিয়োগ না করা, কারণ এরপরে অন্য কোনও উপাদান (যেমন: স্কোপস) এখনও মূল অ্যারেটি উল্লেখ করবে এবং আপনার অ্যাপ্লিকেশনটি ভেঙে যাবে।
যেমন অ্যারে সাফ করার জন্য StudentService
:
/* DON'T DO THAT */
var clear = function () { students = []; }
/* DO THIS INSTEAD */
var clear = function () { students.splice(0, students.length); }
এই সংক্ষিপ্ত ডেমোটিও দেখুন ।
সামান্য আপডেট:
কোনও পরিষেবা ব্যবহারের কথা বলার সময় যে বিভ্রান্তি দেখা দিতে পারে তা এড়াতে কয়েকটি শব্দ, তবে এটি service()
ফাংশনটি দিয়ে তৈরি না করে।
দস্তাবেজগুলি$provide
উদ্ধৃত করে :
একটি কৌণিক পরিষেবা একটি পরিষেবা কারখানার দ্বারা তৈরি একটি সিঙ্গলটন অবজেক্ট । এই পরিষেবা কারখানাগুলি এমন ফাংশন যা ঘুরেফিরে কোনও পরিষেবা সরবরাহকারী তৈরি করে । পরিষেবা প্রদানকারীর কন্সট্রাকটর ফাংশন আছে। তাত্ক্ষণিক হলে তাদের অবশ্যই একটি সম্পত্তি বলা উচিত $get
, যা পরিষেবা কারখানার ফাংশন ধারণ করে ।
[...]
... $provide
পরিষেবা সরবরাহকারীর নির্দিষ্টকরণ ছাড়াই পরিষেবার নিবন্ধকরণের জন্য অতিরিক্ত সহায়ক পদ্ধতি রয়েছে:
- সরবরাহকারী (সরবরাহকারী) - service ইনজেক্টর সহ কোনও পরিষেবা সরবরাহকারীর নিবন্ধন করে
- ধ্রুবক ( আপত্তি ) - সরবরাহকারী এবং পরিষেবাদি দ্বারা অ্যাক্সেস করা যায় এমন একটি মান / অবজেক্ট নিবন্ধভুক্ত করে।
- মান ( আপত্তি ) - এমন একটি মান / অবজেক্ট নিবন্ধন করে যা কেবল পরিষেবাগুলি দ্বারা সরবরাহ করা যায়, সরবরাহকারী নয়।
- কারখানা (fn) - একটি পরিষেবা কারখানার ফাংশন নিবন্ধন করে, fn, যা কোনও পরিষেবা সরবরাহকারী বস্তুতে আবৃত থাকবে, যার $ সম্পত্তি প্রাপ্তিতে প্রদত্ত কারখানার ফাংশন থাকবে।
- পরিষেবাদি (শ্রেণি) - একটি কনস্ট্রাক্টর ফাংশন নিবন্ধন করে, শ্রেণি যা পরিষেবা সরবরাহকারী অবজেক্টে আবৃত থাকবে, যার property সম্পত্তি প্রাপ্ত প্রদায়ক কনস্ট্রাক্টর ফাংশনটি ব্যবহার করে কোনও নতুন অবজেক্ট ইনস্ট্যান্ট করবে।
মূলত, এটি যা বলে তা হ'ল প্রতিটি কৌণিক পরিষেবাটি ব্যবহার করে নিবন্ধভুক্ত $provide.provider()
, তবে সরল পরিষেবাগুলির জন্য "শর্টকাট" পদ্ধতি রয়েছে (যার মধ্যে দুটি হ'ল service()
এবং factory()
)।
এটি সমস্ত কোনও পরিষেবায় "ফুটে যায়", সুতরাং আপনি কোন পদ্ধতিটি ব্যবহার করবেন তা তত বেশি তাত্পর্য দেয় না (যতক্ষণ না আপনার পরিষেবার প্রয়োজনগুলি সেই পদ্ধতিতে আওতাভুক্ত হয়)।
বিটিডাব্লু, provider
বনাম service
বনাম factory
অ্যাংুলার নতুন আগতদের কাছে একটি বিভ্রান্তিকর ধারণা, তবে ভাগ্যক্রমে জিনিসগুলি সহজ করার জন্য প্রচুর সংস্থান (এখানে এসও তে) রয়েছে। (শুধু সন্ধান করুন।)
(আমি আশা করি এটি পরিষ্কার হয়ে যায় - এটি না হলে আমাকে জানান let)