ভেরিয়েবলগুলি সঞ্চয় করতে আমি কৌনিকটিতে কীভাবে $ রুটস্কোপ ব্যবহার করব?


217

আমি $rootScopeপরে অন্য কোনও নিয়ামকটিতে অ্যাক্সেস করতে চাই এমন একটি নিয়ামক হিসাবে ভেরিয়েবলগুলি সঞ্চয় করতে কীভাবে ব্যবহার করব? উদাহরণ স্বরূপ:

angular.module('myApp').controller('myCtrl', function($scope) {
  var a = //something in the scope
  //put it in the root scope
});

angular.module('myApp').controller('myCtrl2', function($scope) {
  var b = //get var a from root scope somehow
  //use var b
});

আমি এই কিভাবে করব?


1
আপনার নিয়ামকটিতে $ রুটস্কোপ ইনজেক্ট করা উচিত এবং এটিকে সহজ জাভাস্ক্রিপ্ট হিসাবে ব্যবহার করা উচিত
অজয় বেনিওয়াল

30
$ রুটস্কোপ এটি করার সঠিক উপায় নয়। একাধিক কন্ট্রোলার জুড়ে ভেরিয়েবলগুলি উপলভ্য করা পরিষেবাগুলির জন্য অনেক বেশি।
স্টিভ

11
@ স্টিভ: অ্যাঙ্গুলারের এফএকিউ বলেছে "" এমন পরিষেবা তৈরি করবেন না যার জীবনের একমাত্র উদ্দেশ্য ডেটা বিট সংরক্ষণ এবং ফিরিয়ে দেওয়া "এটি ডাইজেস্ট চক্রের উপর অত্যধিক বোঝা চাপিয়ে দেবে ..
মারওয়েন ট্রাবেলসি

যদি আমি পরিষেবাগুলিতে কন্ট্রোলারদের ইনজেক্ট করতে না পারি তবে আমি কীভাবে আপনার বলা পরিষেবা থেকে আমার অন্যান্য নিয়ামককে ভেরিয়েবল প্রেরণ করব? আমি এই কাজ করার কোন উপায় দেখতে পাচ্ছি না ... এখানে আপনার অন্তর্দৃষ্টি প্রশংসা ..
অবতরণ

2
ভাল, কারণ এটি
ইনজেকশনযোগ্য

উত্তর:


248

মূল-স্কোপে সেট করা চলকগুলি প্রোটোটাইপিক উত্তরাধিকারের মাধ্যমে নিয়ামক স্কোপে উপলব্ধ।

এখানে @ নীতেশের ডেমো-র একটি পরিবর্তিত সংস্করণ রয়েছে যা সম্পর্কটিকে আরও পরিষ্কার করে দেখায়: http://jsfiddle.net/TmPk5/6/

লক্ষ্য করুন যে মডিউলটি সূচনা করার সময় রুটস্কোপের ভেরিয়েবল সেট করা থাকে এবং তার পরে উত্তরাধিকার সূত্রে প্রাপ্ত প্রত্যেকটির নিজস্ব কপি পাওয়া যায় যা স্বাধীনভাবে ( changeফাংশন) সেট করা যায় can এছাড়াও, রুটস্কোপের মানটিও আপডেট করা যেতে পারে (এতে changeRsফাংশন myCtrl2)

angular.module('myApp', [])
.run(function($rootScope) {
    $rootScope.test = new Date();
})
.controller('myCtrl', function($scope, $rootScope) {
  $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
})
.controller('myCtrl2', function($scope, $rootScope) {
    $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.changeRs = function() {
        $rootScope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
});

7
প্লাস 1 এর জন্য ... আহ ... আসলে ওপির প্রশ্নের উত্তর দিচ্ছে। (যদিও এমবিয়েলস্কি এবং অন্যেরা ঠিক বলেছেন)
র‌্যাপ

আমি যদি এটি করি তবে কি পরিবর্তন $scope.test = 'Some value'হবে $rootScope.test?
অ্যালেন লিন্যাটোক

@ অ্যালেনলিনটোক না, এটি দুটি পৃথক বস্তু নয় যদিও এর পরিধিটি $rootScope বিশ্বব্যাপী (সমস্ত নিয়ামকদের উপরে) তবে $scopeনিয়ামকের কাছে স্থানীয় থেকে যায়। আপনি যদি $scope.testদুটি পৃথক কন্ট্রোলার ব্যবহার করেন তবে জেনে নিন যে এগুলি দুটি $rootScope.test
নিয়ামকগুলিতে

আমি ধরে নিচ্ছি আপনি প্রায়শই একই কারণে আপনি অন্য ভাষাতে গ্লোবাল ভেরিয়েবল ব্যবহার করবেন না $ রুটস্কোপটি ব্যবহার করতে চান না?
Zypps987

আমরা একটি অ্যাপে কয়টি সংখ্যক রুটস্কোপ ভেরিয়েবল তৈরি করতে পারি?
জয়

161

নিয়ন্ত্রণকারীদের মধ্যে ডেটা ভাগ করা কারখানা / পরিষেবাদিগুলির জন্য খুব ভাল। সংক্ষেপে, এটি এই জাতীয় কিছু কাজ করে।

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

app.factory('items', function() {
    var items = [];
    var itemsService = {};

    itemsService.add = function(item) {
        items.push(item);
    };
    itemsService.list = function() {
        return items;
    };

    return itemsService;
});

function Ctrl1($scope,items) {
    $scope.list = items.list; 
}

function Ctrl2($scope, items) {
    $scope.add = items.add;
}

আপনি এই ঝাঁকুনিতে একটি কার্যকারী উদাহরণ দেখতে পারেন: http://jsfiddle.net/mbielski/m8saa/


49
+1 $rootScopeযখন আমাদের কাছে পরিষেবা এবং কারখানাগুলির মতো জিনিস থাকে তখন ভেরিয়েবলগুলি ভাগ করতে ব্যবহার করা উচিত নয়।
jjperezaguinaga

74
ওয়েল, কৌণিক এফএকিউ পৃষ্ঠার নীচে এটি বলে: "বিপরীতভাবে, এমন একটি পরিষেবা তৈরি করবেন না যার জীবনের একমাত্র উদ্দেশ্য ডেটা বিট সংরক্ষণ এবং ফিরিয়ে দেওয়া" " দেখুন: docs.angularjs.org/misc/faq
ওয়তুন

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

1
তবে যদি আপনার আইটেমগুলি দুটি ভিন্ন ভিউ / কন্ট্রোলারে লুপ করা প্রয়োজন, তবে আপনার ভিউটি দেওয়ার জন্য প্রথমে কন্ট্রোলারে ডেটা অনুলিপি করতে হবে? (আমি বিশ্বাস করি এটি $ রুটস্কোপ সমাধান হয়েছে)
থমাস ডেকাক্স

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

21
angular.module('myApp').controller('myCtrl', function($scope, $rootScope) {
   var a = //something in the scope
   //put it in the root scope
    $rootScope.test = "TEST";
 });

angular.module('myApp').controller('myCtrl2', function($scope, $rootScope) {
   var b = //get var a from root scope somehow
   //use var b

   $scope.value = $rootScope.test;
   alert($scope.value);

 //    var b = $rootScope.test;
 //  alert(b);
 });

ডেমো


সুতরাং কৌণিক আপনি সাধারণত var ব্যবহার করবেন না?
ট্রিপসিস

1
এটি অবস্থার উপর নির্ভর করে। যদি এইচটিএমএলতে দেখাতে চান তবে আপনাকে অন্যথায় ব্যবহার করতে হবে
নীতীশ কুমার

ওহ সুযোগ ডম স্টাফের জন্য?
ট্রিপসিস

1
এটি দেরিতে হতে পারে তবে যে কোনও দেরীতে আগতদের জন্য স্কোপটি এজেএস ডকুমেন্টেশন অনুসারে ভিউ এবং নিয়ামকের মধ্যে একটি আঠালো। স্কোপটি সরাসরি ডমকে উল্লেখ করে না। তাহলে এটা কি করে? এখানে আরও সম্পূর্ণ ডক্স ডকস.আঙ্গুলারজেএস.আর.গাইড
স্কোপ

9

আমি এটি করার কোনও কারণ খুঁজে পাই না $ সুযোগ.মূল্য = $ রুটস্কোপ.টেস্ট;

$ স্কোপটি ইতিমধ্যে $ রুটস্কোপ থেকে প্রোটোটাইপ উত্তরাধিকার।

দয়া করে এই উদাহরণটি দেখুন

var app = angular.module('app',[]).run(function($rootScope){
$rootScope.userName = "Rezaul Hasan";
});

এখন আপনি অ্যাপ্লিকেশন ট্যাগের যে কোনও জায়গায় এই স্কোপ ভেরিয়েবলকে বাঁধতে পারেন।


6

প্রথমে মানগুলিকে $ রুটস্কোপে সংরক্ষণ করুন

.run(function($rootScope){
$rootScope.myData = {name : "nikhil"}
})

.controller('myCtrl', function($scope) {
var a ="Nikhilesh";
$scope.myData.name = a;
});

.controller('myCtrl2', function($scope) {
var b = $scope.myData.name;
)}

$ রুটস্কোপ হ'ল সমস্ত স্কোপের পিতামাতা, প্রতিটি $ স্কোপ $ রুটস্কোপ ডেটার একটি অনুলিপি পেয়ে থাকে যা আপনি $ স্কোপ নিজেই ব্যবহার করে অ্যাক্সেস করতে পারেন।


3

যদি এটি কেবল "অন্যান্য নিয়ামকের অ্যাক্সেস" হয় তবে তার জন্য আপনি কৌণিক ধ্রুবক ব্যবহার করতে পারেন, সুবিধাটি হল; আপনি কিছু অ্যাপ্লিকেশন জুড়ে অ্যাক্সেস করতে চান এমন কিছু বিশ্বব্যাপী সেটিংস বা অন্যান্য জিনিস যুক্ত করতে পারেন

app.constant(‘appGlobals’, {
    defaultTemplatePath: '/assets/html/template/',
    appName: 'My Awesome App'
});

এবং তারপরে এটিকে অ্যাক্সেস করুন:

app.controller(‘SomeController’, [‘appGlobals’, function SomeController(config) {
    console.log(appGlobals);
    console.log(‘default path’, appGlobals.defaultTemplatePath);
}]);

(পরীক্ষা হয়নি)

আরও তথ্য: http://ilikekillnerds.com/2014/11/constants-values-global-variables-in-angularjs-theright-way/



1

এটি অর্জনের একাধিক উপায় রয়েছে: -

1. যোগ করুন $rootScopeমধ্যে .runপদ্ধতি

.run(function ($rootScope) {
    $rootScope.name = "Peter";
});

// Controller
.controller('myController', function ($scope,$rootScope) {
    console.log("Name in rootscope ",$rootScope.name);
    OR
    console.log("Name in scope ",$scope.name);
});

2. একটি পরিষেবা তৈরি করুন এবং উভয় নিয়ামকগুলিতে এটি অ্যাক্সেস করুন।

.factory('myFactory', function () {
     var object = {};

     object.users = ['John', 'James', 'Jake']; 

     return object;
})
// Controller A

.controller('ControllerA', function (myFactory) {
    console.log("In controller A ", myFactory);
})

// Controller B

.controller('ControllerB', function (myFactory) {
    console.log("In controller B ", myFactory);
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.