AngularJS এ প্যারেন্ট স্কোপ ভেরিয়েবল আপডেট করুন


113

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

আমার পরিস্থিতিতে আমার একটি ফর্মের মধ্যে ক্যালেন্ডার নিয়ামক রয়েছে। আমি প্যারেন্ট স্কোপ (যা ফর্ম) থেকে শুরু এবং শেষের তারিখগুলি আপডেট করতে চাই যাতে জমা দেওয়ার সময় ফর্মটির শুরু এবং শেষের তারিখ থাকে।


আপনার ক্যালেন্ডার নিয়ামক একটি নির্দেশিকা উচিত বলে মনে হচ্ছে।
জোনা

উত্তর:


193

প্যারেন্ট স্কোপে আপনাকে কোনও অবজেক্ট (আদিম নয়) ব্যবহার করতে হবে এবং তারপরে আপনি এটি সরাসরি সন্তানের সুযোগ থেকে আপডেট করতে সক্ষম হবেন

মূল:

app.controller('ctrlParent',function($scope){
    $scope.parentprimitive = "someprimitive";
    $scope.parentobj = {};
    $scope.parentobj.parentproperty = "someproperty";
});

শিশুঃ

app.controller('ctrlChild',function($scope){
    $scope.parentprimitive = "this will NOT modify the parent"; //new child scope variable
    $scope.parentobj.parentproperty = "this WILL modify the parent";
});

ওয়ার্কিং ডেমো : http://jsfiddle.net/sh0ber/xxNxj/

দেখুন কি পরিধি তারতম্য প্রটোটাইপ / prototypical এর AngularJS মধ্যে উত্তরাধিকার হয়?


1
আমি এটি বাস্তবায়নের চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি: 'সম্পত্তি নির্ধারিত করতে পারি না' পূর্বনির্ধারিতের 'পিতৃপুরুষ'।
Malcr001

আপনি কি আপনার কোড পোস্ট করতে পারেন? এটি ফিডাল ডেমোতে কাজ করছে। যদি আপনার ক্যালেন্ডার নিয়ন্ত্রণটি বিচ্ছিন্ন সুযোগ ব্যবহার করে তবে এটি প্যারেন্ট স্কোপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে না, সুতরাং আপনাকে মানটির নির্দেশকের স্কোপে যেতে হবে।
ড্যান

দুঃখিত আমি এই প্রশ্নের সম্পর্কে ভুলে গেছি। আমি এটি গ্রহণ করেছি কারণ শেষ পর্যন্ত আমি এই উত্তরের সাহায্যে এটি কাজ করার ব্যবস্থা করেছিলাম।
Malcr001

আমি বুঝতে পারি যে সিআরটিএলপিয়ার্ট ডিভ এলিমেন্টে {{প্যারেন্টোব.প্যারেন্টপ্রোপার্টি} putting স্থাপন করা হ'ল প্যারেন্টোবজ অবজেক্টটি ঘোষিত করে এবং এই বস্তুকে সিটিআরএলপেন্দ্রিক স্কোপ হিসাবে সেট করে। এটি কি সঠিক অনুমান?
স্টিফেন

1
ধন্যবাদ, এটি কাজ করে! আমার অবশ্যই এটি (প্রোটোটাইপিকাল সমৃদ্ধি এবং আদিম) পড়তে হবে। আপনি কি এমন ভাল পঠনের প্রস্তাব দিতে পারেন যা আপনার এসও লিঙ্কের চেয়ে কিছুটা বেশি ব্যাখ্যা করে?
jvannistelrooy

116

এই কাজটি করার এবং $scope.$parentভেরিয়েবলটি ব্যবহার না করার জন্য আরও একটি উপায় রয়েছে ।

প্যারেন্ট স্কোপে মান পরিবর্তন করার জন্য কেবল একটি পদ্ধতি প্রস্তুত করুন এবং এটি শিশু হিসাবে ব্যবহার করুন। এটার মত:

app.controller('ctrlParent',function($scope) {
  $scope.simpleValue = 'x';
  $scope.changeSimpleValue = function(newVal) {
    $scope.simpleValue = newVal;
  };
});

app.controller('ctrlChild',function($scope){
    $scope.changeSimpleValue('y');
});

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

এর পরে আপনি আরো মত HTML এ এমনকি পদ্ধতি কল করতে পারেন: <a ng-click="changeSimpleValue('y')" href="#">click me!</a>


1
ভাল সমাধান! এটি কাজ করে কারণ যখন বর্তমান $ স্কোপে কোনও কিছু পাওয়া যায় না, তখন কৌনিকটি $ পিতামাতার মধ্যে সন্ধান করে। docs.angularjs.org/guide/scope ('স্কোপ হায়ারারচি'স দেখুন)।
এলো

আমি এই উত্তরটি পছন্দ করি, একটি অপ্রয়োজনীয় বস্তু তৈরি করার দরকার নেই।
গ্রিমডুড

3
ভবিষ্যত পাঠক: এই পাঁচ-পাঁচটি মন্তব্যই কিছুটা বিভ্রান্ত। প্রতিটি ভেরিয়েবলের জন্য দুটি সেটার ফাংশন (যা "অপ্রয়োজনীয় অবজেক্টস") তৈরি করা উত্তরাধিকারের একটি ছদ্মবেশী এবং অপ্রয়োজনীয় কুল্জ এবং কৌণিক উপায় নয়। অ্যাঙ্গুলারের স্রষ্টা মিসকো হেভির একটি বক্তৃতা দিয়েছেন যাতে তিনি শিখিয়েছেন "যখনই আপনার কাছে এনজি-মডেল রয়েছে সেখানে কোথাও একটি বিন্দু থাকতে হবে If আপনার যদি বিন্দু না থাকে তবে আপনি এটি ভুল করছেন” " মিসকো ভিডিও @ 29:19
ড্যান

আমি কীভাবে কন্ট্রোলার এস সিনট্যাক্স ব্যবহার করে এই সমাধানটি প্রয়োগ করতে পারি?
নিরান

6

এটিও কাজ করে (তবে এটি সর্বোত্তম অনুশীলন অনুসরণ করে কিনা তা নিশ্চিত নয়)

app.controller('ctrlParent',function($scope) {
    $scope.simpleValue = 'x';
});

app.controller('ctrlChild',function($scope){
    $scope.$parent.simpleValue = 'y';
});

1
আপনি সঠিক, $ সুযোগ ব্যবহার করে $ প্যারেন্ট.ভ্যালু বেশিরভাগ ক্ষেত্রে কাজ করবে তবে বৃহত্তর, আরও জটিল প্রকল্পগুলিতে পরিচালনা করা কঠিন হতে পারে বলে সাধারণত এটি ব্যাপকভাবে ব্যবহার করা ভাল ধারণা নয়।
অ্যালেক্স জনসন

4

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

অভিভাবকের দৃষ্টিতে যদি আপনার কিছু আদিম (ইনটস, বুলিয়ানস, স্ট্রিং) পরিবর্তন করতে হয় তবে আপনার এটিকে সেই সুযোগে অন্য কোনও অবজেক্টের বৈশিষ্ট্য হিসাবে চিহ্নিত করা দরকার, সুতরাং অ্যাসাইনমেন্টটি পড়তে পারে:

<a ng-click="viewData.myAttr = 4">Click me!</a>

এবং এটি ঘটাবে:

  1. পেতে viewDataবস্তুর যাই হোক না কেন সুযোগ থেকে এটা সংজ্ঞায়িত করা হয়
  2. এর myAttrবৈশিষ্ট্যে 4 বরাদ্দ করুন ।

4

পিতামাতার মধ্যে ঘোষিত ভেরিয়েবলগুলি অ্যাক্সেসের জন্য, আমাদের child শিশু নিয়ন্ত্রণকারী বা টেম্পলেট ফাইলে পিতামাতার ব্যবহার করা উচিত

নিয়ামক মধ্যে

$scope.$parent.varaiable_name

এইচটিএমএল টেমপ্লেটে

ng-model="$parent.varaiable_name"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.