সম্পাদনা : এই উত্তরে সম্বোধিত সমস্যাটি কৌণিক.জেএস সংস্করণ ১.২..7 এ সমাধান করা হয়েছে । $broadcast
এখন নিবন্ধভুক্ত স্কোপগুলিতে বুদবুদ এড়ানো এবং এমিটের মতো দ্রুত চলে।
সুতরাং, এখন আপনি করতে পারেন:
$broadcast
থেকে ব্যবহার করুন$rootScope
$on
স্থানীয়দের কাছ থেকে$scope
এই ইভেন্টটি সম্পর্কে জানা দরকার তা ব্যবহার করে শুনুন
নীচে মূল উত্তর
আমি উচ্চতর পরামর্শ দিচ্ছি $rootScope.$broadcast
+ না $scope.$on
বরং $rootScope.$emit
+ ব্যবহার করুন $rootScope.$on
। পূর্ববর্তী @numan দ্বারা উত্থাপিত হিসাবে গুরুতর পারফরম্যান্স সমস্যা সৃষ্টি করতে পারে। কারণ ইভেন্টটি সমস্ত স্কোপগুলিতে বুদবুদ হবে ।
তবে, আধুনিক (ব্যবহার $rootScope.$emit
+ $rootScope.$on
) এতে ভোগেন না এবং তাই দ্রুত যোগাযোগ চ্যানেল হিসাবে ব্যবহার করা যেতে পারে!
এর কৌনিক ডকুমেন্টেশন থেকে $emit
:
রেজিস্টার্ডকে অবহিত করে স্কোপ হায়ারার্কির মাধ্যমে একটি ইভেন্টের নাম উপরের দিকে প্রেরণ করে
যেহেতু উপরের কোনও সুযোগ নেই $rootScope
, তাই কোনও বুদবুদ হচ্ছে না। ইভেন্টবাস হিসাবে $rootScope.$emit()
/ ব্যবহার করা সম্পূর্ণ নিরাপদ $rootScope.$on()
।
তবে এটি নিয়ন্ত্রণকারীদের মধ্যে থেকে ব্যবহার করার সময় একটি গ্যাচা রয়েছে। আপনি যদি $rootScope.$on()
কোনও নিয়ামকের মধ্যে থেকে সরাসরি বাঁধাই করেন , আপনার স্থানীয়টি $scope
ধ্বংস হয়ে যাওয়ার পরে আপনাকে নিজেকে নিজেকে বাইন্ডিং সাফ করতে হবে । এর কারণ হ'ল নিয়ন্ত্রকরা (পরিষেবাদির বিপরীতে) কোনও অ্যাপ্লিকেশন চলাকালীন একাধিকবার ইনস্ট্যান্টেশনযুক্ত হয়ে উঠতে পারেন যা ফলস্বরূপ পুরো জায়গা জুড়ে মেমরি ফাঁস তৈরির সংমিশ্রণ তৈরি করে :)
নিবন্ধন মুক্ত করার জন্য, শুধু আপনার শুনতে $scope
'র $destroy
এবং ইভেন্ট তারপর ফাংশন যা দ্বারা ফিরে ছিল কল $rootScope.$on
।
angular
.module('MyApp')
.controller('MyController', ['$scope', '$rootScope', function MyController($scope, $rootScope) {
var unbind = $rootScope.$on('someComponent.someCrazyEvent', function(){
console.log('foo');
});
$scope.$on('$destroy', unbind);
}
]);
আমি বলব, এটি সত্যিই একটি কৌনিক নির্দিষ্ট জিনিস নয় কারণ এটি অন্যান্য ইভেন্টবাস বাস্তবায়নের ক্ষেত্রেও প্রযোজ্য, আপনাকে সংস্থানগুলি পরিষ্কার করতে হবে।
তবে আপনি সেই ক্ষেত্রে আপনার জীবনকে আরও সহজ করে তুলতে পারেন । উদাহরণস্বরূপ, আপনি বানর প্যাচ $rootScope
দিতে পারেন এবং এটি এমন একটি দিতে পারেন $onRootScope
যা এতে নির্গত ইভেন্টগুলিতে সাবস্ক্রাইব করে $rootScope
তবে স্থানীয় $scope
ধ্বংস হয়ে গেলে সরাসরি হ্যান্ডলারটিকে পরিষ্কার করে দেয় ।
এ $rootScope
জাতীয় $onRootScope
পদ্ধতি সরবরাহের জন্য বানরকে প্যাচ করার সর্বোত্তম উপায়টি হবে কোনও ডেকরেটারের মাধ্যমে (কোনও রান ব্লক সম্ভবত এটি ঠিক ঠিক করবে তবে পিএসএসটি, কাউকে বলবেন না)
আমরা ব্যবহার করে সেট করে $onRootScope
রেখেছিলে গণনা করার সময় সম্পত্তিটি অপ্রত্যাশিত দেখাবে না তা নিশ্চিত করার জন্য । আপনার একটি ES5 শিম প্রয়োজন হতে পারে মনে রাখবেন।$scope
Object.defineProperty()
enumerable
false
angular
.module('MyApp')
.config(['$provide', function($provide){
$provide.decorator('$rootScope', ['$delegate', function($delegate){
Object.defineProperty($delegate.constructor.prototype, '$onRootScope', {
value: function(name, listener){
var unsubscribe = $delegate.$on(name, listener);
this.$on('$destroy', unsubscribe);
return unsubscribe;
},
enumerable: false
});
return $delegate;
}]);
}]);
এই পদ্ধতিতে জায়গায় রেখে কন্ট্রোলার কোডটি উপরে থেকে সরল করা যেতে পারে:
angular
.module('MyApp')
.controller('MyController', ['$scope', function MyController($scope) {
$scope.$onRootScope('someComponent.someCrazyEvent', function(){
console.log('foo');
});
}
]);
সুতরাং এই সমস্তের চূড়ান্ত ফলাফল হিসাবে আমি আপনাকে $rootScope.$emit
+ ব্যবহার করার পরামর্শ দিচ্ছি $scope.$onRootScope
।
বিটিডব্লু, আমি কৌণিক দলের মধ্যে সমস্যাটি সমাধান করার জন্য কৌনিক দলকে বোঝানোর চেষ্টা করছি। এখানে একটি আলোচনা চলছে: https://github.com/angular/angular.js/issues/4574
এখানে এমন একটি জাসস্পিফ রয়েছে যা দেখায় যে পারফেক্ট প্রভাবগুলি $broadcast
কেবলমাত্র 100 এর সাথে একটি শালীন দৃশ্যে টেবিলে নিয়ে আসে $scope
।
http://jsperf.com/rootscope-emit-vs-rootscope-broadcast